Skip to content

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

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.

Account

The calling key.

GET/meDescribe the calling key

Returns 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/json
    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.
    • keyIdstring (uuid)required

      Key id.

    • keyNamestringrequired

      Name given by the hotel.

    • keyPrefixstring | nullrequired

      Public prefix (first 8 characters after stryk_live_).

    • scopesarray<string>required

      Granted 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"

    • hotelHotelRefrequired

      Hotel the API key belongs to.

      Show fields (2)
      • idstringrequired

        Hotel id.

      • namestring | nullrequired

        Display name.

    • expiresAtstring | null (date-time)required

      Expiry, null if the key does not expire.

    • rateLimitRateLimitrequired

      Rate limit of the key.

      Show fields (2)
      • limitintegerrequired

        Requests per window for this key (default 120; a different tier is set by STRYK on request).

      • windowSecondsintegerrequired

        Window 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Name, address, time zone, currency, languages, check-in/out times and contact data.

Scopes: property:readoperationId getHotel

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Hotel.application/json
    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.
    • idstringrequired

      Hotel id.

    • namestring | nullrequired

      Display name.

    • legalNamestring | null

      Legal (invoice) name when it differs from the display name.

    • addressAddressrequired

      Postal address.

      Show fields (4)
      • streetstring | null

        Street and number.

      • postalCodestring | null

        Postal code.

      • citystring | null

        City.

      • countrystring | null

        ISO 3166-1 alpha-2 country code.

    • timezonestringrequired

      IANA time zone, e.g. Europe/Vienna.

    • currencystringrequired

      Hotel currency (ISO 4217).

    • languagesarray<string>required

      Guest languages the hotel maintains content for (ISO 639-1).

    • checkInFromstring | null

      Earliest check-in time HH:MM (hotel-local).

    • checkOutUntilstring | null

      Latest check-out time HH:MM (hotel-local).

    • contactContactrequired

      Public contact data of the hotel.

      Show fields (3)
      • emailstring | null

        E-mail.

      • phonestring | null

        Phone.

      • websitestring | null

        Website URL.

    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

All 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

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

Responses

  • 200Room types.application/json
    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.
    • dataarray<RoomType>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (15)
      • idstring (uuid)required

        Room type id.

      • namestringrequired

        Name.

      • codestring | null

        Short code.

      • descriptionobjectrequired

        Description by language code (ISO 639-1); und when the language is unknown.

      • maxOccupancyintegerrequired

        Maximum guests including extra beds.

      • maxAdultsintegerrequired

        Maximum adults in any allowed occupancy.

      • maxChildrenintegerrequired

        Maximum children in any allowed occupancy.

      • standardOccupancyintegerrequired

        Occupancy the base price refers to.

      • bedConfigurationarray<string>required

        Beds, e.g. double_bed, twin_beds, sofa_bed.

      • sizeSqminteger | null

        Size in square metres.

      • amenitiesarray<Amenity>required
        Show fields (2)
        • codestring | nullrequired

          Stable amenity key.

        • namestring | nullrequired

          Label in the hotel language.

      • imagesarray<Image>required

        Empty when the hotel has no booking-engine address.

        Show fields (3)
        • urlstring (uri)required

          Public HTTPS URL.

        • altstring | null

          Alternative text.

        • positionintegerrequired

          Sort position, 0 first.

      • unitCountintegerrequired

        Active units of this type.

      • activebooleanrequired

        Sellable category.

      • versionstringrequired

        ETag value without quotes.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

One room type with occupancy, beds, amenities and images.

Scopes: property:readoperationId getRoomType

Parameters, path

NameInTypeDescription
roomTypeIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Room type.application/json
    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.
    • idstring (uuid)required

      Room type id.

    • namestringrequired

      Name.

    • codestring | null

      Short code.

    • descriptionobjectrequired

      Description by language code (ISO 639-1); und when the language is unknown.

    • maxOccupancyintegerrequired

      Maximum guests including extra beds.

    • maxAdultsintegerrequired

      Maximum adults in any allowed occupancy.

    • maxChildrenintegerrequired

      Maximum children in any allowed occupancy.

    • standardOccupancyintegerrequired

      Occupancy the base price refers to.

    • bedConfigurationarray<string>required

      Beds, e.g. double_bed, twin_beds, sofa_bed.

    • sizeSqminteger | null

      Size in square metres.

    • amenitiesarray<Amenity>required
      Show fields (2)
      • codestring | nullrequired

        Stable amenity key.

      • namestring | nullrequired

        Label in the hotel language.

    • imagesarray<Image>required

      Empty when the hotel has no booking-engine address.

      Show fields (3)
      • urlstring (uri)required

        Public HTTPS URL.

      • altstring | null

        Alternative text.

      • positionintegerrequired

        Sort position, 0 first.

    • unitCountintegerrequired

      Active units of this type.

    • activebooleanrequired

      Sellable category.

    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Rooms and apartments (no housekeeping internals), ordered by updatedAt, id.

Scopes: property:readoperationId listUnits

Parameters, query

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

updated_sincequerystring (date-time)

RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt.

roomTypeIdquerystring (uuid)

Only this room type.

Responses

  • 200Units.application/json
    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.
    • dataarray<Unit>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (8)
      • idstring (uuid)required

        Unit id.

      • numberstringrequired

        Room number.

      • roomTypeIdstring (uuid)required

        Room type.

      • floorinteger | null

        Floor.

      • activebooleanrequired

        In operation.

      • housekeepingStatusstring | null

        Housekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.

      • updatedAtstring (date-time)required

        Last change of the room master data.

      • versionstringrequired

        ETag value without quotes; changes with master data and housekeeping status.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

One room or apartment.

Scopes: property:readoperationId getUnit

Parameters, path

NameInTypeDescription
unitIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Unit.application/json
    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.
    • idstring (uuid)required

      Unit id.

    • numberstringrequired

      Room number.

    • roomTypeIdstring (uuid)required

      Room type.

    • floorinteger | null

      Floor.

    • activebooleanrequired

      In operation.

    • housekeepingStatusstring | null

      Housekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.

    • updatedAtstring (date-time)required

      Last change of the room master data.

    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Sets 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

NameInTypeDescription
unitIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-Matchrequiredheaderstring

ETag of the version you read. Missing → 428, stale → 412.

Idempotency-Keyheaderstring

Optional idempotency key, same rules as for POST.

Request body application/json, required

New housekeeping status.

  • housekeepingStatusstringrequired

    Built-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/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • idstring (uuid)required

      Unit id.

    • numberstringrequired

      Room number.

    • roomTypeIdstring (uuid)required

      Room type.

    • floorinteger | null

      Floor.

    • activebooleanrequired

      In operation.

    • housekeepingStatusstring | null

      Housekeeping status (see UnitUpdateRequest); hotel-specific statuses keep their own id.

    • updatedAtstring (date-time)required

      Last change of the room master data.

    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
}'
Example, 200
{
  "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

Sellable 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

NameInTypeDescription
fromrequiredquerystring (date)

First date (YYYY-MM-DD, hotel-local).

torequiredquerystring (date)

Last date, inclusive; the range covers at most 366 days.

roomTypeIdquerystring (uuid)

Only this room type.

Responses

  • 200Availability.application/json
    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.
    • fromstring (date)required
    • tostring (date)required
    • dataarray<AvailabilityDay>required
      Show fields (7)
      • roomTypeIdstring (uuid)required
      • datestring (date)required

        Night (hotel-local).

      • availableintegerrequired

        Units still sellable for this night.

      • closedbooleanrequired

        Closed for sale.

      • minStayintegerrequired

        Minimum nights for arrivals on this date.

      • closedToArrivalbooleanrequired

        No arrival on this date.

      • closedToDeparturebooleanrequired

        No 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

One-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

NameInTypeDescription
fromrequiredquerystring (date)

First date (YYYY-MM-DD, hotel-local).

torequiredquerystring (date)

Last date, inclusive; the range covers at most 366 days.

roomTypeIdquerystring (uuid)

Only this room type.

ratePlanIdquerystring (uuid)

Only this rate plan.

Responses

  • 200Rates.application/json
    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.
    • fromstring (date)required
    • tostring (date)required
    • dataarray<RateDay>required
      Show fields (5)
      • roomTypeIdstring (uuid)required
      • ratePlanIdstring | null (uuid)required

        Null when no rate plan is sold through the API (base price).

      • datestring (date)required
      • priceobjectrequired

        Accommodation price of one night.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • occupancyintegerrequired

        Guests 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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 plans sold through the API sales channel, including inactive ones.

Scopes: rates:readoperationId listRatePlans

Parameters, query

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

updated_sincequerystring (date-time)

RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt.

Responses

  • 200Rate plans.application/json
    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.
    • dataarray<RatePlan>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (9)
      • idstring (uuid)required

        Rate plan id.

      • namestringrequired

        Name.

      • codestring | null

        Short code.

      • descriptionstring | null

        Description.

      • roomTypeIdsarray<string (uuid)>required

        Room types the plan applies to; empty means all.

      • mealPlanstring | null

        Meal plan.

        Values: "breakfast", "room_only", null

      • cancellationPolicyCancellationPolicy | null
        Show fields (3)
        • summarystring | null

          Guest-facing summary in the hotel language.

        • refundableboolean | null

          Free cancellation is possible at some point.

        • freeCancellationHoursBeforeinteger | null

          Free cancellation until this many hours before arrival.

      • activebooleanrequired

        Currently sellable.

      • updatedAtstring (date-time)required

        Last change.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Calculates 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 application/json, required

Stay to price.

  • checkInstring (date)required

    Arrival (hotel-local), not before today.

  • checkOutstring (date)required

    Departure, after checkIn (max. 365 nights).

  • roomTypeIdstring (uuid)required
  • ratePlanIdstring | null (uuid)

    Optional rate plan sold through the API.

  • adultsintegerrequired

    Adults (>= 1).

  • childrenAgesarray<integer>

    Age of each child (0-17).

  • discountCodestring | null

    Hotel discount code.

Responses

  • 200Quote.application/json
    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.
    • availablebooleanrequired

      False: see reasons; prices are null.

    • reasonsarray<QuoteReason>required
      Show fields (2)
      • codestringrequired

        Reason code.

        Values: "sold_out", "min_stay_not_met", "closed_to_arrival", "closed_to_departure", "rate_plan_not_applicable", "not_bookable"

      • messagestringrequired

        English explanation.

    • roomTypeIdstring (uuid)required
    • ratePlanIdstring | null (uuid)required
    • checkInstring (date)required
    • checkOutstring (date)required
    • nightsintegerrequired
    • totalMoney | nullrequired

      Amount the booking will cost: accommodation plus taxes and fees not included.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • accommodationMoney | nullrequired

      Accommodation price after discounts.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • taxesAndFeesarray<TaxOrFee>required
      Show fields (3)
      • namestringrequired

        Label in the hotel language.

      • amountMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • includedbooleanrequired

        True: already contained in accommodation; false: added on top in total.

    • nightlyarray<NightlyPrice>required
      Show fields (2)
      • datestring (date)required
      • priceMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

    • cancellationPolicyCancellationPolicy | nullrequired
      Show fields (3)
      • summarystring | null

        Guest-facing summary in the hotel language.

      • refundableboolean | null

        Free cancellation is possible at some point.

      • freeCancellationHoursBeforeinteger | null

        Free 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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]
}'
Example, 200
{
  "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

All bookings of the hotel (every sales channel), ordered by updatedAt, id. Use updated_since for incremental sync.

Scopes: bookings:readoperationId listBookings

Parameters, query

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

updated_sincequerystring (date-time)

RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt.

statusquerystring-
arrivalFromquerystring (date)

checkIn >= date.

arrivalToquerystring (date)

checkIn <= date.

externalReferencequerystring

Exact external reference.

Responses

  • 200Bookings.application/json
    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.
    • dataarray<Booking>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (21)
      • idstring (uuid)required
      • referencestringrequired

        Booking number shown to the hotel and the guest.

      • statusstringrequired

        Booking status.

        Values: "pending", "tentative", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"

      • channelstringrequired

        Sales path.

        Values: "direct", "manual", "channels", "api"

      • externalReferencestring | nullrequired

        Partner reference (unique per hotel).

      • checkInstring (date)required
      • checkOutstring (date)required
      • nightsintegerrequired
      • adultsintegerrequired
      • childrenintegerrequired
      • childrenAgesarray<integer>required
      • roomsarray<BookingRoom>required
        Show fields (5)
        • roomTypeIdstring (uuid)required
        • unitIdstring | null (uuid)required

          Assigned unit.

        • ratePlanIdstring | null (uuid)required
        • adultsintegerrequired
        • childrenintegerrequired
      • guestBookingGuestrequired

        Primary guest snapshot of the booking.

        Show fields (5)
        • idstring | null (uuid)required

          Guest profile, if linked.

        • firstNamestring | nullrequired
        • lastNamestring | nullrequired
        • emailstring | nullrequired
        • phonestring | nullrequired
      • totalobjectrequired

        Booking total calculated by STRYK.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • paidobjectrequired

        Settled amount (all payment paths).

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • outstandingobjectrequired

        total minus paid, never negative.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • notesstring | nullrequired
      • cancellationBookingCancellation | nullrequired
        Show fields (2)
        • cancelledAtstring | null (date-time)required
        • feeMoney | nullrequired

          Cancellation fee according to the hotel's policy.

          Show fields (2)
          • amountstringrequired

            Decimal string, exactly two fraction digits.

          • currencystringrequired

            ISO 4217 currency code.

      • createdAtstring (date-time)required
      • updatedAtstring (date-time)required
      • versionstringrequired

        ETag value without quotes.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Creates 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

NameInTypeDescription
Idempotency-Keyrequiredheaderstring

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 application/json, required

New booking.

  • roomTypeIdstring (uuid)required
  • ratePlanIdstring | null (uuid)
  • checkInstring (date)required
  • checkOutstring (date)required
  • adultsintegerrequired
  • childrenAgesarray<integer>
  • guestGuestInputrequired

    Guest of a new booking.

    Show fields (6)
    • firstNamestringrequired
    • lastNamestringrequired
    • emailstring (email)required

      Guest e-mail.

    • phonestring | null
    • countrystring | null

      Residence country (ISO 3166-1 alpha-2).

    • addressAddress | null
      Show fields (4)
      • streetstring | null

        Street and number.

      • postalCodestring | null

        Postal code.

      • citystring | null

        City.

      • countrystring | null

        ISO 3166-1 alpha-2 country code.

  • notesstring | null
  • externalReferencestring | null

    Your reference, unique per hotel.

  • statusstring | null

    Initial status (default confirmed).

    Values: "confirmed", "tentative", null

  • expectedTotalMoney | null

    Price you showed the guest; a mismatch returns 409 conflict with currentTotal.

    Show fields (2)
    • amountstringrequired

      Decimal string, exactly two fraction digits.

    • currencystringrequired

      ISO 4217 currency code.

  • discountCodestring | null
  • notifyGuestboolean | null

    Send 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/json
    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.
    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)required
    • referencestringrequired

      Booking number shown to the hotel and the guest.

    • statusstringrequired

      Booking status.

      Values: "pending", "tentative", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"

    • channelstringrequired

      Sales path.

      Values: "direct", "manual", "channels", "api"

    • externalReferencestring | nullrequired

      Partner reference (unique per hotel).

    • checkInstring (date)required
    • checkOutstring (date)required
    • nightsintegerrequired
    • adultsintegerrequired
    • childrenintegerrequired
    • childrenAgesarray<integer>required
    • roomsarray<BookingRoom>required
      Show fields (5)
      • roomTypeIdstring (uuid)required
      • unitIdstring | null (uuid)required

        Assigned unit.

      • ratePlanIdstring | null (uuid)required
      • adultsintegerrequired
      • childrenintegerrequired
    • guestBookingGuestrequired

      Primary guest snapshot of the booking.

      Show fields (5)
      • idstring | null (uuid)required

        Guest profile, if linked.

      • firstNamestring | nullrequired
      • lastNamestring | nullrequired
      • emailstring | nullrequired
      • phonestring | nullrequired
    • totalobjectrequired

      Booking total calculated by STRYK.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paidobjectrequired

      Settled amount (all payment paths).

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingobjectrequired

      total minus paid, never negative.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • notesstring | nullrequired
    • cancellationBookingCancellation | nullrequired
      Show fields (2)
      • cancelledAtstring | null (date-time)required
      • feeMoney | nullrequired

        Cancellation fee according to the hotel's policy.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

    • createdAtstring (date-time)required
    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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
}'
Example, 201
{
  "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

One booking with ETag.

Scopes: bookings:readoperationId getBooking

Parameters, path

NameInTypeDescription
bookingIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Booking.application/json
    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.
    • idstring (uuid)required
    • referencestringrequired

      Booking number shown to the hotel and the guest.

    • statusstringrequired

      Booking status.

      Values: "pending", "tentative", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"

    • channelstringrequired

      Sales path.

      Values: "direct", "manual", "channels", "api"

    • externalReferencestring | nullrequired

      Partner reference (unique per hotel).

    • checkInstring (date)required
    • checkOutstring (date)required
    • nightsintegerrequired
    • adultsintegerrequired
    • childrenintegerrequired
    • childrenAgesarray<integer>required
    • roomsarray<BookingRoom>required
      Show fields (5)
      • roomTypeIdstring (uuid)required
      • unitIdstring | null (uuid)required

        Assigned unit.

      • ratePlanIdstring | null (uuid)required
      • adultsintegerrequired
      • childrenintegerrequired
    • guestBookingGuestrequired

      Primary guest snapshot of the booking.

      Show fields (5)
      • idstring | null (uuid)required

        Guest profile, if linked.

      • firstNamestring | nullrequired
      • lastNamestring | nullrequired
      • emailstring | nullrequired
      • phonestring | nullrequired
    • totalobjectrequired

      Booking total calculated by STRYK.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paidobjectrequired

      Settled amount (all payment paths).

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingobjectrequired

      total minus paid, never negative.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • notesstring | nullrequired
    • cancellationBookingCancellation | nullrequired
      Show fields (2)
      • cancelledAtstring | null (date-time)required
      • feeMoney | nullrequired

        Cancellation fee according to the hotel's policy.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

    • createdAtstring (date-time)required
    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Changes 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

NameInTypeDescription
bookingIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-Matchrequiredheaderstring

ETag of the version you read. Missing → 428, stale → 412.

Idempotency-Keyheaderstring

Optional idempotency key, same rules as for POST.

Request body application/json, required

Fields to change.

  • guestBookingGuestPatch | null
    Show fields (4)
    • firstNamestring | null
    • lastNamestring | null
    • emailstring | null (email)
    • phonestring | null
  • notesstring | null
  • externalReferencestring | null

Responses

  • 200Updated booking.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • idstring (uuid)required
    • referencestringrequired

      Booking number shown to the hotel and the guest.

    • statusstringrequired

      Booking status.

      Values: "pending", "tentative", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"

    • channelstringrequired

      Sales path.

      Values: "direct", "manual", "channels", "api"

    • externalReferencestring | nullrequired

      Partner reference (unique per hotel).

    • checkInstring (date)required
    • checkOutstring (date)required
    • nightsintegerrequired
    • adultsintegerrequired
    • childrenintegerrequired
    • childrenAgesarray<integer>required
    • roomsarray<BookingRoom>required
      Show fields (5)
      • roomTypeIdstring (uuid)required
      • unitIdstring | null (uuid)required

        Assigned unit.

      • ratePlanIdstring | null (uuid)required
      • adultsintegerrequired
      • childrenintegerrequired
    • guestBookingGuestrequired

      Primary guest snapshot of the booking.

      Show fields (5)
      • idstring | null (uuid)required

        Guest profile, if linked.

      • firstNamestring | nullrequired
      • lastNamestring | nullrequired
      • emailstring | nullrequired
      • phonestring | nullrequired
    • totalobjectrequired

      Booking total calculated by STRYK.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paidobjectrequired

      Settled amount (all payment paths).

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingobjectrequired

      total minus paid, never negative.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • notesstring | nullrequired
    • cancellationBookingCancellation | nullrequired
      Show fields (2)
      • cancelledAtstring | null (date-time)required
      • feeMoney | nullrequired

        Cancellation fee according to the hotel's policy.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

    • createdAtstring (date-time)required
    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
}'
Example, 200
{
  "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

Cancels 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

NameInTypeDescription
bookingIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
Idempotency-Keyrequiredheaderstring

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 application/json, required

Optional reason.

  • reasonstring | null

    Reason for the hotel's log.

Responses

  • 200Cancelled booking.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • idstring (uuid)required
    • referencestringrequired

      Booking number shown to the hotel and the guest.

    • statusstringrequired

      Booking status.

      Values: "pending", "tentative", "confirmed", "checked_in", "checked_out", "cancelled", "no_show"

    • channelstringrequired

      Sales path.

      Values: "direct", "manual", "channels", "api"

    • externalReferencestring | nullrequired

      Partner reference (unique per hotel).

    • checkInstring (date)required
    • checkOutstring (date)required
    • nightsintegerrequired
    • adultsintegerrequired
    • childrenintegerrequired
    • childrenAgesarray<integer>required
    • roomsarray<BookingRoom>required
      Show fields (5)
      • roomTypeIdstring (uuid)required
      • unitIdstring | null (uuid)required

        Assigned unit.

      • ratePlanIdstring | null (uuid)required
      • adultsintegerrequired
      • childrenintegerrequired
    • guestBookingGuestrequired

      Primary guest snapshot of the booking.

      Show fields (5)
      • idstring | null (uuid)required

        Guest profile, if linked.

      • firstNamestring | nullrequired
      • lastNamestring | nullrequired
      • emailstring | nullrequired
      • phonestring | nullrequired
    • totalobjectrequired

      Booking total calculated by STRYK.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paidobjectrequired

      Settled amount (all payment paths).

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingobjectrequired

      total minus paid, never negative.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • notesstring | nullrequired
    • cancellationBookingCancellation | nullrequired
      Show fields (2)
      • cancelledAtstring | null (date-time)required
      • feeMoney | nullrequired

        Cancellation fee according to the hotel's policy.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

    • createdAtstring (date-time)required
    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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."
}'
Example, 200
{
  "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

Guest profiles (GDPR-minimal), ordered by updatedAt, id. Erased guests and guests with restricted processing are not visible.

Scopes: guests:readoperationId listGuests

Parameters, query

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

updated_sincequerystring (date-time)

RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt.

emailquerystring

Exact e-mail (case-insensitive).

Responses

  • 200Guests.application/json
    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.
    • dataarray<Guest>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (10)
      • idstring (uuid)required
      • firstNamestring | nullrequired
      • lastNamestring | nullrequired
      • salutationstring | null
      • emailstring | null
      • phonestring | null
      • countrystring | null

        ISO 3166-1 alpha-2.

      • addressAddress | null
        Show fields (4)
        • streetstring | null

          Street and number.

        • postalCodestring | null

          Postal code.

        • citystring | null

          City.

        • countrystring | null

          ISO 3166-1 alpha-2 country code.

      • updatedAtstring (date-time)required
      • versionstringrequired

        ETag value without quotes.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

One guest profile with ETag.

Scopes: guests:readoperationId getGuest

Parameters, path

NameInTypeDescription
guestIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Guest.application/json
    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.
    • idstring (uuid)required
    • firstNamestring | nullrequired
    • lastNamestring | nullrequired
    • salutationstring | null
    • emailstring | null
    • phonestring | null
    • countrystring | null

      ISO 3166-1 alpha-2.

    • addressAddress | null
      Show fields (4)
      • streetstring | null

        Street and number.

      • postalCodestring | null

        Postal code.

      • citystring | null

        City.

      • countrystring | null

        ISO 3166-1 alpha-2 country code.

    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Changes name, salutation, e-mail, phone, country and address of a guest profile. Requires If-Match.

Scopes: guests:writeoperationId updateGuest

Parameters, path

NameInTypeDescription
guestIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-Matchrequiredheaderstring

ETag of the version you read. Missing → 428, stale → 412.

Idempotency-Keyheaderstring

Optional idempotency key, same rules as for POST.

Request body application/json, required

Fields to change.

  • firstNamestring | null
  • lastNamestring | null
  • salutationstring | null
  • emailstring | null (email)
  • phonestring | null
  • countrystring | null
  • addressAddress | null
    Show fields (4)
    • streetstring | null

      Street and number.

    • postalCodestring | null

      Postal code.

    • citystring | null

      City.

    • countrystring | null

      ISO 3166-1 alpha-2 country code.

Responses

  • 200Updated guest.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • idstring (uuid)required
    • firstNamestring | nullrequired
    • lastNamestring | nullrequired
    • salutationstring | null
    • emailstring | null
    • phonestring | null
    • countrystring | null

      ISO 3166-1 alpha-2.

    • addressAddress | null
      Show fields (4)
      • streetstring | null

        Street and number.

      • postalCodestring | null

        Postal code.

      • citystring | null

        City.

      • countrystring | null

        ISO 3166-1 alpha-2 country code.

    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
}'
Example, 200
{
  "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

Total, paid and outstanding amount plus online payments. Read only; the API never accepts payment data.

Scopes: payments:readoperationId getBookingPayments

Parameters, path

NameInTypeDescription
bookingIdrequiredpathstring (uuid)-

Responses

  • 200Payment status.application/json
    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.
    • bookingIdstring (uuid)required
    • statusstringrequired

      Values: "unpaid", "partially_paid", "paid", "refunded", "overpaid"

    • totalMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paidMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • paymentsarray<Payment>required

      Online payments (max. 50). Front-desk payments are part of paid only.

      Show fields (5)
      • idstring (uuid)required
      • statusstringrequired

        Values: "requires_action", "authorized", "captured", "partially_refunded", "refunded", "failed", "cancelled", "expired", "unknown"

      • methodstringrequired

        Values: "bank_transfer", "provider_checkout", "credit_card", "paypal", "google_pay", "apple_pay", "eps", "point_of_sale", "other"

      • amountMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Records 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

NameInTypeDescription
invoiceIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
Idempotency-Keyrequiredheaderstring

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 application/json, required

Received bank transfer.

  • amountMoneyrequired

    Amount in the invoice currency, at most the open amount.

    Show fields (2)
    • amountstringrequired

      Decimal string, exactly two fraction digits.

    • currencystringrequired

      ISO 4217 currency code.

  • paidAtstring | null (date)

    Value date (default today).

  • referencestring | null

    Bank reference (max. 140).

Responses

  • 201Recorded payment.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • invoiceIdstring (uuid)required

      Invoice.

    • methodstringrequired

      Always bank_transfer.

    • amountMoneyrequired

      Recorded amount.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • invoiceStatusstringrequired

      Invoice status afterwards (issued, partially_paid, paid, …).

    • outstandingMoneyrequired

      Open amount afterwards.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
}'
Example, 201
{
  "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

Issued invoices, corrections and credit notes (never drafts), ordered by updatedAt, id.

Scopes: invoices:readoperationId listInvoices

Parameters, query

NameInTypeDescription
limitqueryinteger

Page size 1-200 (default 50).

cursorquerystring

nextCursor of the previous page. Keep all other parameters unchanged.

updated_sincequerystring (date-time)

RFC 3339 timestamp; returns items with updatedAt >= value. Deduplicate on id + updatedAt.

bookingIdquerystring (uuid)

Only documents of this booking.

Responses

  • 200Invoices.application/json
    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.
    • dataarray<Invoice>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (12)
      • idstring (uuid)required
      • numberstring | nullrequired

        Invoice number.

      • typestringrequired

        Values: "invoice", "correction", "credit_note"

      • bookingIdstring | null (uuid)required
      • statusstringrequired

        Values: "issued", "partially_paid", "paid", "overdue", "cancelled", "credited"

      • issuedAtstring | null (date-time)required
      • totalobjectrequired

        Gross amount.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • netMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • taxMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • outstandingMoneyrequired

        Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

        Show fields (2)
        • amountstringrequired

          Decimal string, exactly two fraction digits.

        • currencystringrequired

          ISO 4217 currency code.

      • updatedAtstring (date-time)required
      • versionstringrequired

        ETag value without quotes.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Header and totals of one issued document. No PDF in v1.

Scopes: invoices:readoperationId getInvoice

Parameters, path

NameInTypeDescription
invoiceIdrequiredpathstring (uuid)-

Headers

NameInTypeDescription
If-None-Matchheaderstring

ETag you hold; 304 when unchanged.

Responses

  • 200Invoice.application/json
    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.
    • idstring (uuid)required
    • numberstring | nullrequired

      Invoice number.

    • typestringrequired

      Values: "invoice", "correction", "credit_note"

    • bookingIdstring | null (uuid)required
    • statusstringrequired

      Values: "issued", "partially_paid", "paid", "overdue", "cancelled", "credited"

    • issuedAtstring | null (date-time)required
    • totalobjectrequired

      Gross amount.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • netMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • taxMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • outstandingMoneyrequired

      Money amount: decimal string with exactly two fraction digits and an ISO 4217 currency. Never use binary floating point for it.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

    • updatedAtstring (date-time)required
    • versionstringrequired

      ETag 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

All 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/json
    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.
    • dataarray<WebhookEventTypeInfo>required

      Items of this page, ordered by updatedAt ascending, then id.

      Show fields (2)
      • typestringrequired

        Webhook event type.

        Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

      • descriptionstringrequired

        What triggers the event.

    • nextCursorstring | nullrequired

      Opaque cursor for the next page; null on the last page.

    • hasMorebooleanrequired

      True 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Closes 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

NameInTypeDescription
Idempotency-Keyrequiredheaderstring

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 application/json, required

Restriction to create.

  • roomTypeIdstring (uuid)required

    Active room type.

  • typestringrequired

    closure (not sellable), capacity_cap (at most capacity units), closed_to_arrival, closed_to_departure.

    Values: "closure", "capacity_cap", "closed_to_arrival", "closed_to_departure"

  • fromstring (date)required

    First day (inclusive).

  • tostring (date)required

    Last day (inclusive), at most 500 days after from.

  • capacityinteger | null

    Only for capacity_cap; 0 to active units − 1.

  • namestring | null

    Label shown to the hotel (max. 120).

Responses

  • 201Created restriction.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • idstring (uuid)required

      Restriction id.

    • roomTypeIdstring (uuid)required

      Room type.

    • typestringrequired

      Restriction type.

    • fromstring (date)required

      First day.

    • tostring (date)required

      Last day.

    • capacityinteger | null

      Cap for capacity_cap.

    • namestring | null

      Label.

    • createdAtstring (date-time)required

      Creation 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
}'
Example, 201
{
  "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

Removes 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

NameInTypeDescription
restrictionIdrequiredpathstring (uuid)-

Responses

  • 200Deleted restriction.application/json
    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.
    • idstring (uuid)required

      Restriction id.

    • roomTypeIdstring (uuid)required

      Room type.

    • typestringrequired

      Restriction type.

    • fromstring (date)required

      First day.

    • tostring (date)required

      Last day.

    • capacityinteger | null

      Cap for capacity_cap.

    • namestring | null

      Label.

    • createdAtstring (date-time)required

      Creation 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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"
Example, 200
{
  "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

Sets 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

NameInTypeDescription
Idempotency-Keyheaderstring

Optional idempotency key, same rules as for POST.

Request body application/json, required

Daily prices.

  • roomTypeIdstring (uuid)required

    Active room type.

  • pricesarray<RatePriceInput>required

    1-366 days, each date once, within 366 days.

    Show fields (2)
    • datestring (date)required

      Day (today or later).

    • priceMoney | null

      Price per night in the hotel currency, or null.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 4217 currency code.

Responses

  • 200Result.application/json
    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.
    Idempotent-Replayed
    true when the response is the stored result of an earlier request with the same Idempotency-Key.
    • roomTypeIdstring (uuid)required

      Room type.

    • fromstring (date)required

      First affected day.

    • tostring (date)required

      Last affected day.

    • changedintegerrequired

      Days with a new price.

    • unchangedintegerrequired

      Days that already had this price or no price to reset.

    • resetintegerrequired

      Days 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    Retry-After
    Seconds to wait before retrying.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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+json
    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.
    • typestring (uri)required

      URI of the error documentation.

    • titlestringrequired

      Short summary of the error class.

    • statusintegerrequired

      HTTP status code.

    • detailstring

      Human-readable explanation of this occurrence.

    • instancestring

      Request path.

    • codestringrequired

      Stable 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"

    • requestIdstringrequired

      Same value as the X-Request-Id response header; quote it to support.

    • errorsarray<object>

      Field errors for validation_failed.

      Show fields (2)
      • fieldstringrequired

        Request field (dot notation).

      • messagestringrequired

        What is wrong with it.

    • currentTotalobject

      conflict on POST /bookings: the current server price.

      Show fields (2)
      • amountstringrequired

        Decimal string, exactly two fraction digits.

      • currencystringrequired

        ISO 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
    }
  ]
}'
Example, 200
{
  "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

A 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

A 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

Contact 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

Sellable 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

Daily 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

The 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

The 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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

Test 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

NameInTypeDescription
STRYK-Event-Idrequiredheaderstring

Event id (same as body id).

STRYK-Event-Typerequiredheaderstring

Event type.

STRYK-Delivery-Idrequiredheaderstring

Id of this delivery (differs per endpoint).

STRYK-Delivery-Attemptrequiredheaderstring

Attempt number, 1-8.

STRYK-Signaturerequiredheaderstring

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 application/json, required

  • idstringrequired

    Event id (evt_<uuid>); deduplicate on it.

  • typestringrequired

    Webhook event type.

    Values: "booking.created", "booking.updated", "booking.cancelled", "guest.updated", "availability.changed", "rate.changed", "payment.updated", "unit.updated", "webhook.test"

  • apiVersionstringrequired
  • createdAtstring (date-time)required
  • hotelIdstringrequired
  • dataobjectrequired
    Show fields (8)
    • objectstringrequired

      Values: "booking", "guest", "availability", "rate", "payment", "webhook"

    • idstring

      Object 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.
Payload
{
  "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"
  }
}