# Waiting Rooms ## List waiting rooms for account or zone `client.WaitingRooms.List(ctx, params) (*V4PagePaginationArray[WaitingRoom], error)` **get** `/{accounts_or_zones}/{account_or_zone_id}/waiting_rooms` Lists waiting rooms for account or zone. ### Parameters - `params WaitingRoomListParams` - `AccountID param.Field[string]` Path param: The Account ID to use for this endpoint. Mutually exclusive with the Zone ID. - `ZoneID param.Field[string]` Path param: The Zone ID to use for this endpoint. Mutually exclusive with the Account ID. - `Page param.Field[float64]` Query param: Page number of paginated results. - `PerPage param.Field[float64]` Query param: Maximum number of results per page. Must be a multiple of 5. ### Returns - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.List(context.TODO(), waiting_rooms.WaitingRoomListParams{ }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "699d98642c564d2e855e9661899b7252", "additional_routes": [ { "host": "shop2.example.com", "path": "/shop2/checkout" } ], "cookie_attributes": { "samesite": "auto", "secure": "auto" }, "cookie_suffix": "abcd", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}", "default_template_language": "es-ES", "description": "Production - DO NOT MODIFY", "disable_session_renewal": false, "enabled_origin_commands": [ "revoke" ], "host": "shop.example.com", "json_response_enabled": false, "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar", "new_users_per_minute": 200, "next_event_prequeue_start_time": "2021-09-28T15:00:00.000Z", "next_event_start_time": "2021-09-28T15:00:00.000Z", "path": "/shop/checkout", "queue_all": true, "queueing_method": "fifo", "queueing_status_code": 202, "session_duration": 1, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Waiting room details `client.WaitingRooms.Get(ctx, waitingRoomID, query) (*WaitingRoom, error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}` Fetches a single configured waiting room. ### Parameters - `waitingRoomID string` - `query WaitingRoomGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) waitingRoom, err := client.WaitingRooms.Get( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.WaitingRoomGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", waitingRoom.ID) } ``` #### Response ```json { "result": { "id": "699d98642c564d2e855e9661899b7252", "additional_routes": [ { "host": "shop2.example.com", "path": "/shop2/checkout" } ], "cookie_attributes": { "samesite": "auto", "secure": "auto" }, "cookie_suffix": "abcd", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}", "default_template_language": "es-ES", "description": "Production - DO NOT MODIFY", "disable_session_renewal": false, "enabled_origin_commands": [ "revoke" ], "host": "shop.example.com", "json_response_enabled": false, "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar", "new_users_per_minute": 200, "next_event_prequeue_start_time": "2021-09-28T15:00:00.000Z", "next_event_start_time": "2021-09-28T15:00:00.000Z", "path": "/shop/checkout", "queue_all": true, "queueing_method": "fifo", "queueing_status_code": 202, "session_duration": 1, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Create waiting room `client.WaitingRooms.New(ctx, params) (*WaitingRoom, error)` **post** `/zones/{zone_id}/waiting_rooms` Creates a new waiting room. ### Parameters - `params WaitingRoomNewParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Query param.Field[Query]` Body param ### Returns - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) waitingRoom, err := client.WaitingRooms.New(context.TODO(), waiting_rooms.WaitingRoomNewParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Query: waiting_rooms.QueryParam{ Host: cloudflare.F("shop.example.com"), Name: cloudflare.F("production_webinar"), NewUsersPerMinute: cloudflare.F(int64(200)), TotalActiveUsers: cloudflare.F(int64(200)), }, }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", waitingRoom.ID) } ``` #### Response ```json { "result": { "id": "699d98642c564d2e855e9661899b7252", "additional_routes": [ { "host": "shop2.example.com", "path": "/shop2/checkout" } ], "cookie_attributes": { "samesite": "auto", "secure": "auto" }, "cookie_suffix": "abcd", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}", "default_template_language": "es-ES", "description": "Production - DO NOT MODIFY", "disable_session_renewal": false, "enabled_origin_commands": [ "revoke" ], "host": "shop.example.com", "json_response_enabled": false, "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar", "new_users_per_minute": 200, "next_event_prequeue_start_time": "2021-09-28T15:00:00.000Z", "next_event_start_time": "2021-09-28T15:00:00.000Z", "path": "/shop/checkout", "queue_all": true, "queueing_method": "fifo", "queueing_status_code": 202, "session_duration": 1, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Update waiting room `client.WaitingRooms.Update(ctx, waitingRoomID, params) (*WaitingRoom, error)` **put** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}` Updates a configured waiting room. ### Parameters - `waitingRoomID string` - `params WaitingRoomUpdateParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Query param.Field[Query]` Body param ### Returns - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) waitingRoom, err := client.WaitingRooms.Update( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.WaitingRoomUpdateParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Query: waiting_rooms.QueryParam{ Host: cloudflare.F("shop.example.com"), Name: cloudflare.F("production_webinar"), NewUsersPerMinute: cloudflare.F(int64(200)), TotalActiveUsers: cloudflare.F(int64(200)), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", waitingRoom.ID) } ``` #### Response ```json { "result": { "id": "699d98642c564d2e855e9661899b7252", "additional_routes": [ { "host": "shop2.example.com", "path": "/shop2/checkout" } ], "cookie_attributes": { "samesite": "auto", "secure": "auto" }, "cookie_suffix": "abcd", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}", "default_template_language": "es-ES", "description": "Production - DO NOT MODIFY", "disable_session_renewal": false, "enabled_origin_commands": [ "revoke" ], "host": "shop.example.com", "json_response_enabled": false, "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar", "new_users_per_minute": 200, "next_event_prequeue_start_time": "2021-09-28T15:00:00.000Z", "next_event_start_time": "2021-09-28T15:00:00.000Z", "path": "/shop/checkout", "queue_all": true, "queueing_method": "fifo", "queueing_status_code": 202, "session_duration": 1, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Patch waiting room `client.WaitingRooms.Edit(ctx, waitingRoomID, params) (*WaitingRoom, error)` **patch** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}` Patches a configured waiting room. ### Parameters - `waitingRoomID string` - `params WaitingRoomEditParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Query param.Field[Query]` Body param ### Returns - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) waitingRoom, err := client.WaitingRooms.Edit( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.WaitingRoomEditParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Query: waiting_rooms.QueryParam{ Host: cloudflare.F("shop.example.com"), Name: cloudflare.F("production_webinar"), NewUsersPerMinute: cloudflare.F(int64(200)), TotalActiveUsers: cloudflare.F(int64(200)), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", waitingRoom.ID) } ``` #### Response ```json { "result": { "id": "699d98642c564d2e855e9661899b7252", "additional_routes": [ { "host": "shop2.example.com", "path": "/shop2/checkout" } ], "cookie_attributes": { "samesite": "auto", "secure": "auto" }, "cookie_suffix": "abcd", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}", "default_template_language": "es-ES", "description": "Production - DO NOT MODIFY", "disable_session_renewal": false, "enabled_origin_commands": [ "revoke" ], "host": "shop.example.com", "json_response_enabled": false, "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar", "new_users_per_minute": 200, "next_event_prequeue_start_time": "2021-09-28T15:00:00.000Z", "next_event_start_time": "2021-09-28T15:00:00.000Z", "path": "/shop/checkout", "queue_all": true, "queueing_method": "fifo", "queueing_status_code": 202, "session_duration": 1, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Delete waiting room `client.WaitingRooms.Delete(ctx, waitingRoomID, body) (*WaitingRoomDeleteResponse, error)` **delete** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}` Deletes a waiting room. ### Parameters - `waitingRoomID string` - `body WaitingRoomDeleteParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type WaitingRoomDeleteResponse struct{…}` - `ID string` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) waitingRoom, err := client.WaitingRooms.Delete( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.WaitingRoomDeleteParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", waitingRoom.ID) } ``` #### Response ```json { "result": { "id": "699d98642c564d2e855e9661899b7252" } } ``` ## Domain Types ### Additional Routes - `type AdditionalRoutes struct{…}` - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. ### Cookie Attributes - `type CookieAttributes struct{…}` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` ### Query - `type Query struct{…}` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage QueryDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const QueryDefaultTemplateLanguageEnUs QueryDefaultTemplateLanguage = "en-US"` - `const QueryDefaultTemplateLanguageEsEs QueryDefaultTemplateLanguage = "es-ES"` - `const QueryDefaultTemplateLanguageDeDe QueryDefaultTemplateLanguage = "de-DE"` - `const QueryDefaultTemplateLanguageFrFr QueryDefaultTemplateLanguage = "fr-FR"` - `const QueryDefaultTemplateLanguageItIt QueryDefaultTemplateLanguage = "it-IT"` - `const QueryDefaultTemplateLanguageJaJp QueryDefaultTemplateLanguage = "ja-JP"` - `const QueryDefaultTemplateLanguageKoKr QueryDefaultTemplateLanguage = "ko-KR"` - `const QueryDefaultTemplateLanguagePtBr QueryDefaultTemplateLanguage = "pt-BR"` - `const QueryDefaultTemplateLanguageZhCn QueryDefaultTemplateLanguage = "zh-CN"` - `const QueryDefaultTemplateLanguageZhTw QueryDefaultTemplateLanguage = "zh-TW"` - `const QueryDefaultTemplateLanguageNlNl QueryDefaultTemplateLanguage = "nl-NL"` - `const QueryDefaultTemplateLanguagePlPl QueryDefaultTemplateLanguage = "pl-PL"` - `const QueryDefaultTemplateLanguageIDID QueryDefaultTemplateLanguage = "id-ID"` - `const QueryDefaultTemplateLanguageTrTr QueryDefaultTemplateLanguage = "tr-TR"` - `const QueryDefaultTemplateLanguageArEg QueryDefaultTemplateLanguage = "ar-EG"` - `const QueryDefaultTemplateLanguageRuRu QueryDefaultTemplateLanguage = "ru-RU"` - `const QueryDefaultTemplateLanguageFaIr QueryDefaultTemplateLanguage = "fa-IR"` - `const QueryDefaultTemplateLanguageBgBg QueryDefaultTemplateLanguage = "bg-BG"` - `const QueryDefaultTemplateLanguageHrHr QueryDefaultTemplateLanguage = "hr-HR"` - `const QueryDefaultTemplateLanguageCsCz QueryDefaultTemplateLanguage = "cs-CZ"` - `const QueryDefaultTemplateLanguageDaDK QueryDefaultTemplateLanguage = "da-DK"` - `const QueryDefaultTemplateLanguageFiFi QueryDefaultTemplateLanguage = "fi-FI"` - `const QueryDefaultTemplateLanguageLtLt QueryDefaultTemplateLanguage = "lt-LT"` - `const QueryDefaultTemplateLanguageMsMy QueryDefaultTemplateLanguage = "ms-MY"` - `const QueryDefaultTemplateLanguageNbNo QueryDefaultTemplateLanguage = "nb-NO"` - `const QueryDefaultTemplateLanguageRoRo QueryDefaultTemplateLanguage = "ro-RO"` - `const QueryDefaultTemplateLanguageElGr QueryDefaultTemplateLanguage = "el-GR"` - `const QueryDefaultTemplateLanguageHeIl QueryDefaultTemplateLanguage = "he-IL"` - `const QueryDefaultTemplateLanguageHiIn QueryDefaultTemplateLanguage = "hi-IN"` - `const QueryDefaultTemplateLanguageHuHu QueryDefaultTemplateLanguage = "hu-HU"` - `const QueryDefaultTemplateLanguageSrBa QueryDefaultTemplateLanguage = "sr-BA"` - `const QueryDefaultTemplateLanguageSkSk QueryDefaultTemplateLanguage = "sk-SK"` - `const QueryDefaultTemplateLanguageSlSi QueryDefaultTemplateLanguage = "sl-SI"` - `const QueryDefaultTemplateLanguageSvSe QueryDefaultTemplateLanguage = "sv-SE"` - `const QueryDefaultTemplateLanguageTlPh QueryDefaultTemplateLanguage = "tl-PH"` - `const QueryDefaultTemplateLanguageThTh QueryDefaultTemplateLanguage = "th-TH"` - `const QueryDefaultTemplateLanguageUkUA QueryDefaultTemplateLanguage = "uk-UA"` - `const QueryDefaultTemplateLanguageViVn QueryDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []QueryEnabledOriginCommand` A list of enabled origin commands. - `const QueryEnabledOriginCommandRevoke QueryEnabledOriginCommand = "revoke"` - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod QueryQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const QueryQueueingMethodFifo QueryQueueingMethod = "fifo"` - `const QueryQueueingMethodRandom QueryQueueingMethod = "random"` - `const QueryQueueingMethodPassthrough QueryQueueingMethod = "passthrough"` - `const QueryQueueingMethodReject QueryQueueingMethod = "reject"` - `QueueingStatusCode QueryQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const QueryQueueingStatusCode200 QueryQueueingStatusCode = 200` - `const QueryQueueingStatusCode202 QueryQueueingStatusCode = 202` - `const QueryQueueingStatusCode429 QueryQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TurnstileAction QueryTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const QueryTurnstileActionLog QueryTurnstileAction = "log"` - `const QueryTurnstileActionInfiniteQueue QueryTurnstileAction = "infinite_queue"` - `TurnstileMode QueryTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const QueryTurnstileModeOff QueryTurnstileMode = "off"` - `const QueryTurnstileModeInvisible QueryTurnstileMode = "invisible"` - `const QueryTurnstileModeVisibleNonInteractive QueryTurnstileMode = "visible_non_interactive"` - `const QueryTurnstileModeVisibleManaged QueryTurnstileMode = "visible_managed"` ### Waiting Room - `type WaitingRoom struct{…}` - `ID string` - `AdditionalRoutes []AdditionalRoutes` Only available for the Waiting Room Advanced subscription. Additional hostname and path combinations to which this waiting room will be applied. There is an implied wildcard at the end of the path. The hostname and path combination must be unique to this and all other waiting rooms. - `Host string` The hostname to which this waiting room will be applied (no wildcards). The hostname must be the primary domain, subdomain, or custom hostname (if using SSL for SaaS) of this zone. Please do not include the scheme (http:// or https://). - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `CookieAttributes CookieAttributes` Configures cookie attributes for the waiting room cookie. This encrypted cookie stores a user's status in the waiting room, such as queue position. - `Samesite CookieAttributesSamesite` Configures the SameSite attribute on the waiting room cookie. Value `auto` will be translated to `lax` or `none` depending if **Always Use HTTPS** is enabled. Note that when using value `none`, the secure attribute cannot be set to `never`. - `const CookieAttributesSamesiteAuto CookieAttributesSamesite = "auto"` - `const CookieAttributesSamesiteLax CookieAttributesSamesite = "lax"` - `const CookieAttributesSamesiteNone CookieAttributesSamesite = "none"` - `const CookieAttributesSamesiteStrict CookieAttributesSamesite = "strict"` - `Secure CookieAttributesSecure` Configures the Secure attribute on the waiting room cookie. Value `always` indicates that the Secure attribute will be set in the Set-Cookie header, `never` indicates that the Secure attribute will not be set, and `auto` will set the Secure attribute depending if **Always Use HTTPS** is enabled. - `const CookieAttributesSecureAuto CookieAttributesSecure = "auto"` - `const CookieAttributesSecureAlways CookieAttributesSecure = "always"` - `const CookieAttributesSecureNever CookieAttributesSecure = "never"` - `CookieSuffix string` Appends a '_' + a custom suffix to the end of Cloudflare Waiting Room's cookie name(__cf_waitingroom). If `cookie_suffix` is "abcd", the cookie name will be `__cf_waitingroom_abcd`. This field is required if using `additional_routes`. - `CreatedOn Time` - `CustomPageHTML string` Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. - `DefaultTemplateLanguage WaitingRoomDefaultTemplateLanguage` The language of the default page template. If no default_template_language is provided, then `en-US` (English) will be used. - `const WaitingRoomDefaultTemplateLanguageEnUs WaitingRoomDefaultTemplateLanguage = "en-US"` - `const WaitingRoomDefaultTemplateLanguageEsEs WaitingRoomDefaultTemplateLanguage = "es-ES"` - `const WaitingRoomDefaultTemplateLanguageDeDe WaitingRoomDefaultTemplateLanguage = "de-DE"` - `const WaitingRoomDefaultTemplateLanguageFrFr WaitingRoomDefaultTemplateLanguage = "fr-FR"` - `const WaitingRoomDefaultTemplateLanguageItIt WaitingRoomDefaultTemplateLanguage = "it-IT"` - `const WaitingRoomDefaultTemplateLanguageJaJp WaitingRoomDefaultTemplateLanguage = "ja-JP"` - `const WaitingRoomDefaultTemplateLanguageKoKr WaitingRoomDefaultTemplateLanguage = "ko-KR"` - `const WaitingRoomDefaultTemplateLanguagePtBr WaitingRoomDefaultTemplateLanguage = "pt-BR"` - `const WaitingRoomDefaultTemplateLanguageZhCn WaitingRoomDefaultTemplateLanguage = "zh-CN"` - `const WaitingRoomDefaultTemplateLanguageZhTw WaitingRoomDefaultTemplateLanguage = "zh-TW"` - `const WaitingRoomDefaultTemplateLanguageNlNl WaitingRoomDefaultTemplateLanguage = "nl-NL"` - `const WaitingRoomDefaultTemplateLanguagePlPl WaitingRoomDefaultTemplateLanguage = "pl-PL"` - `const WaitingRoomDefaultTemplateLanguageIDID WaitingRoomDefaultTemplateLanguage = "id-ID"` - `const WaitingRoomDefaultTemplateLanguageTrTr WaitingRoomDefaultTemplateLanguage = "tr-TR"` - `const WaitingRoomDefaultTemplateLanguageArEg WaitingRoomDefaultTemplateLanguage = "ar-EG"` - `const WaitingRoomDefaultTemplateLanguageRuRu WaitingRoomDefaultTemplateLanguage = "ru-RU"` - `const WaitingRoomDefaultTemplateLanguageFaIr WaitingRoomDefaultTemplateLanguage = "fa-IR"` - `const WaitingRoomDefaultTemplateLanguageBgBg WaitingRoomDefaultTemplateLanguage = "bg-BG"` - `const WaitingRoomDefaultTemplateLanguageHrHr WaitingRoomDefaultTemplateLanguage = "hr-HR"` - `const WaitingRoomDefaultTemplateLanguageCsCz WaitingRoomDefaultTemplateLanguage = "cs-CZ"` - `const WaitingRoomDefaultTemplateLanguageDaDK WaitingRoomDefaultTemplateLanguage = "da-DK"` - `const WaitingRoomDefaultTemplateLanguageFiFi WaitingRoomDefaultTemplateLanguage = "fi-FI"` - `const WaitingRoomDefaultTemplateLanguageLtLt WaitingRoomDefaultTemplateLanguage = "lt-LT"` - `const WaitingRoomDefaultTemplateLanguageMsMy WaitingRoomDefaultTemplateLanguage = "ms-MY"` - `const WaitingRoomDefaultTemplateLanguageNbNo WaitingRoomDefaultTemplateLanguage = "nb-NO"` - `const WaitingRoomDefaultTemplateLanguageRoRo WaitingRoomDefaultTemplateLanguage = "ro-RO"` - `const WaitingRoomDefaultTemplateLanguageElGr WaitingRoomDefaultTemplateLanguage = "el-GR"` - `const WaitingRoomDefaultTemplateLanguageHeIl WaitingRoomDefaultTemplateLanguage = "he-IL"` - `const WaitingRoomDefaultTemplateLanguageHiIn WaitingRoomDefaultTemplateLanguage = "hi-IN"` - `const WaitingRoomDefaultTemplateLanguageHuHu WaitingRoomDefaultTemplateLanguage = "hu-HU"` - `const WaitingRoomDefaultTemplateLanguageSrBa WaitingRoomDefaultTemplateLanguage = "sr-BA"` - `const WaitingRoomDefaultTemplateLanguageSkSk WaitingRoomDefaultTemplateLanguage = "sk-SK"` - `const WaitingRoomDefaultTemplateLanguageSlSi WaitingRoomDefaultTemplateLanguage = "sl-SI"` - `const WaitingRoomDefaultTemplateLanguageSvSe WaitingRoomDefaultTemplateLanguage = "sv-SE"` - `const WaitingRoomDefaultTemplateLanguageTlPh WaitingRoomDefaultTemplateLanguage = "tl-PH"` - `const WaitingRoomDefaultTemplateLanguageThTh WaitingRoomDefaultTemplateLanguage = "th-TH"` - `const WaitingRoomDefaultTemplateLanguageUkUA WaitingRoomDefaultTemplateLanguage = "uk-UA"` - `const WaitingRoomDefaultTemplateLanguageViVn WaitingRoomDefaultTemplateLanguage = "vi-VN"` - `Description string` A note that you can use to add more details about the waiting room. - `DisableSessionRenewal bool` Only available for the Waiting Room Advanced subscription. Disables automatic renewal of session cookies. If `true`, an accepted user will have session_duration minutes to browse the site. After that, they will have to go through the waiting room again. If `false`, a user's session cookie will be automatically renewed on every request. - `EnabledOriginCommands []WaitingRoomEnabledOriginCommand` A list of enabled origin commands. - `const WaitingRoomEnabledOriginCommandRevoke WaitingRoomEnabledOriginCommand = "revoke"` - `Host string` The host name to which the waiting room will be applied (no wildcards). Please do not include the scheme (http:// or https://). The host and path combination must be unique. - `JsonResponseEnabled bool` Only available for the Waiting Room Advanced subscription. If `true`, requests to the waiting room with the header `Accept: application/json` will receive a JSON response object with information on the user's status in the waiting room as opposed to the configured static HTML page. This JSON response object has one property `cfWaitingRoom` which is an object containing the following fields: 1. `inWaitingRoom`: Boolean indicating if the user is in the waiting room (always **true**). 1. `waitTimeKnown`: Boolean indicating if the current estimated wait times are accurate. If **false**, they are not available. 1. `waitTime`: Valid only when `waitTimeKnown` is **true**. Integer indicating the current estimated time in minutes the user will wait in the waiting room. When `queueingMethod` is **random**, this is set to `waitTime50Percentile`. 1. `waitTime25Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 25% of users that gain entry the fastest (25th percentile). 1. `waitTime50Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 50% of users that gain entry the fastest (50th percentile). In other words, half of the queued users are expected to let into the origin website before `waitTime50Percentile` and half are expected to be let in after it. 1. `waitTime75Percentile`: Valid only when `queueingMethod` is **random** and `waitTimeKnown` is **true**. Integer indicating the current estimated maximum wait time for the 75% of users that gain entry the fastest (75th percentile). 1. `waitTimeFormatted`: String displaying the `waitTime` formatted in English for users. If `waitTimeKnown` is **false**, `waitTimeFormatted` will display **unavailable**. 1. `queueIsFull`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueAll`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website. 1. `lastUpdated`: String displaying the timestamp as an ISO 8601 string of the user's last attempt to leave the waiting room and be let into the origin website. The user is able to make another attempt after `refreshIntervalSeconds` past this time. If the user makes a request too soon, it will be ignored and `lastUpdated` will not change. 1. `refreshIntervalSeconds`: Integer indicating the number of seconds after `lastUpdated` until the user is able to make another attempt to leave the waiting room and be let into the origin website. When the `queueingMethod` is `reject`, there is no specified refresh time —_it will always be **zero**. 1. `queueingMethod`: The queueing method currently used by the waiting room. It is either **fifo**, **random**, **passthrough**, or **reject**. 1. `isFIFOQueue`: Boolean indicating if the waiting room uses a FIFO (First-In-First-Out) queue. 1. `isRandomQueue`: Boolean indicating if the waiting room uses a Random queue where users gain access randomly. 1. `isPassthroughQueue`: Boolean indicating if the waiting room uses a passthrough queue. Keep in mind that when passthrough is enabled, this JSON response will only exist when `queueAll` is **true** or `isEventPrequeueing` is **true** because in all other cases requests will go directly to the origin. 1. `isRejectQueue`: Boolean indicating if the waiting room uses a reject queue. 1. `isEventActive`: Boolean indicating if an event is currently occurring. Events are able to change a waiting room's behavior during a specified period of time. For additional information, look at the event properties `prequeue_start_time`, `event_start_time`, and `event_end_time` in the documentation for creating waiting room events. Events are considered active between these start and end times, as well as during the prequeueing period if it exists. 1. `isEventPrequeueing`: Valid only when `isEventActive` is **true**. Boolean indicating if an event is currently prequeueing users before it starts. 1. `timeUntilEventStart`: Valid only when `isEventPrequeueing` is **true**. Integer indicating the number of minutes until the event starts. 1. `timeUntilEventStartFormatted`: String displaying the `timeUntilEventStart` formatted in English for users. If `isEventPrequeueing` is **false**, `timeUntilEventStartFormatted` will display **unavailable**. 1. `timeUntilEventEnd`: Valid only when `isEventActive` is **true**. Integer indicating the number of minutes until the event ends. 1. `timeUntilEventEndFormatted`: String displaying the `timeUntilEventEnd` formatted in English for users. If `isEventActive` is **false**, `timeUntilEventEndFormatted` will display **unavailable**. 1. `shuffleAtEventStart`: Valid only when `isEventActive` is **true**. Boolean indicating if the users in the prequeue are shuffled randomly when the event starts. 1. `turnstile`: Empty when turnstile isn't enabled. String displaying an html tag to display the Turnstile widget. Please add the `{{{turnstile}}}` tag to the `custom_html` template to ensure the Turnstile widget appears. 1. `infiniteQueue`: Boolean indicating whether the response is for a user in the infinite queue. An example cURL to a waiting room could be: curl -X GET "https://example.com/waitingroom" \ -H "Accept: application/json" If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **fifo** and no event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 0, "waitTime50Percentile": 0, "waitTime75Percentile": 0, "waitTimeFormatted": "10 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "fifo", "isFIFOQueue": true, "isRandomQueue": false, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": false, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 0, "timeUntilEventEndFormatted": "unavailable", "shuffleAtEventStart": false } } If `json_response_enabled` is **true** and the request hits the waiting room, an example JSON response when `queueingMethod` is **random** and an event is active could be: { "cfWaitingRoom": { "inWaitingRoom": true, "waitTimeKnown": true, "waitTime": 10, "waitTime25Percentile": 5, "waitTime50Percentile": 10, "waitTime75Percentile": 15, "waitTimeFormatted": "5 minutes to 15 minutes", "queueIsFull": false, "queueAll": false, "lastUpdated": "2020-08-03T23:46:00.000Z", "refreshIntervalSeconds": 20, "queueingMethod": "random", "isFIFOQueue": false, "isRandomQueue": true, "isPassthroughQueue": false, "isRejectQueue": false, "isEventActive": true, "isEventPrequeueing": false, "timeUntilEventStart": 0, "timeUntilEventStartFormatted": "unavailable", "timeUntilEventEnd": 15, "timeUntilEventEndFormatted": "15 minutes", "shuffleAtEventStart": true } } - `ModifiedOn Time` - `Name string` A unique name to identify the waiting room. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` Sets the number of new users that will be let into the route every minute. This value is used as baseline for the number of users that are let in per minute. So it is possible that there is a little more or little less traffic coming to the route based on the traffic patterns at that time around the world. - `NextEventPrequeueStartTime string` An ISO 8601 timestamp that marks when the next event will begin queueing. - `NextEventStartTime string` An ISO 8601 timestamp that marks when the next event will start. - `Path string` Sets the path within the host to enable the waiting room on. The waiting room will be enabled for all subpaths as well. If there are two waiting rooms on the same subpath, the waiting room for the most specific path will be chosen. Wildcards and query parameters are not supported. - `QueueAll bool` If queue_all is `true`, all the traffic that is coming to a route will be sent to the waiting room. No new traffic can get to the route once this field is set and estimated time will become unavailable. - `QueueingMethod WaitingRoomQueueingMethod` Sets the queueing method used by the waiting room. Changing this parameter from the **default** queueing method is only available for the Waiting Room Advanced subscription. Regardless of the queueing method, if `queue_all` is enabled or an event is prequeueing, users in the waiting room will not be accepted to the origin. These users will always see a waiting room page that refreshes automatically. The valid queueing methods are: 1. `fifo` **(default)**: First-In-First-Out queue where customers gain access in the order they arrived. 1. `random`: Random queue where customers gain access randomly, regardless of arrival time. 1. `passthrough`: Users will pass directly through the waiting room and into the origin website. As a result, any configured limits will not be respected while this is enabled. This method can be used as an alternative to disabling a waiting room (with `suspended`) so that analytics are still reported. This can be used if you wish to allow all traffic normally, but want to restrict traffic during a waiting room event, or vice versa. 1. `reject`: Users will be immediately rejected from the waiting room. As a result, no users will reach the origin website while this is enabled. This can be used if you wish to reject all traffic while performing maintenance, block traffic during a specified period of time (an event), or block traffic while events are not occurring. Consider a waiting room used for vaccine distribution that only allows traffic during sign-up events, and otherwise blocks all traffic. For this case, the waiting room uses `reject`, and its events override this with `fifo`, `random`, or `passthrough`. When this queueing method is enabled and neither `queueAll` is enabled nor an event is prequeueing, the waiting room page **will not refresh automatically**. - `const WaitingRoomQueueingMethodFifo WaitingRoomQueueingMethod = "fifo"` - `const WaitingRoomQueueingMethodRandom WaitingRoomQueueingMethod = "random"` - `const WaitingRoomQueueingMethodPassthrough WaitingRoomQueueingMethod = "passthrough"` - `const WaitingRoomQueueingMethodReject WaitingRoomQueueingMethod = "reject"` - `QueueingStatusCode WaitingRoomQueueingStatusCode` HTTP status code returned to a user while in the queue. - `const WaitingRoomQueueingStatusCode200 WaitingRoomQueueingStatusCode = 200` - `const WaitingRoomQueueingStatusCode202 WaitingRoomQueueingStatusCode = 202` - `const WaitingRoomQueueingStatusCode429 WaitingRoomQueueingStatusCode = 429` - `SessionDuration int64` Lifetime of a cookie (in minutes) set by Cloudflare for users who get access to the route. If a user is not seen by Cloudflare again in that time period, they will be treated as a new user that visits the route. - `Suspended bool` Suspends or allows traffic going to the waiting room. If set to `true`, the traffic will not go to the waiting room. - `TotalActiveUsers int64` Sets the total number of active user sessions on the route at a point in time. A route is a combination of host and path on which a waiting room is available. This value is used as a baseline for the total number of active user sessions on the route. It is possible to have a situation where there are more or less active users sessions on the route based on the traffic patterns at that time around the world. - `TurnstileAction WaitingRoomTurnstileAction` Which action to take when a bot is detected using Turnstile. `log` will have no impact on queueing behavior, simply keeping track of how many bots are detected in Waiting Room Analytics. `infinite_queue` will send bots to a false queueing state, where they will never reach your origin. `infinite_queue` requires Advanced Waiting Room. - `const WaitingRoomTurnstileActionLog WaitingRoomTurnstileAction = "log"` - `const WaitingRoomTurnstileActionInfiniteQueue WaitingRoomTurnstileAction = "infinite_queue"` - `TurnstileMode WaitingRoomTurnstileMode` Which Turnstile widget type to use for detecting bot traffic. See [the Turnstile documentation](https://developers.cloudflare.com/turnstile/concepts/widget/#widget-types) for the definitions of these widget types. Set to `off` to disable the Turnstile integration entirely. Setting this to anything other than `off` or `invisible` requires Advanced Waiting Room. - `const WaitingRoomTurnstileModeOff WaitingRoomTurnstileMode = "off"` - `const WaitingRoomTurnstileModeInvisible WaitingRoomTurnstileMode = "invisible"` - `const WaitingRoomTurnstileModeVisibleNonInteractive WaitingRoomTurnstileMode = "visible_non_interactive"` - `const WaitingRoomTurnstileModeVisibleManaged WaitingRoomTurnstileMode = "visible_managed"` # Page ## Create a custom waiting room page preview `client.WaitingRooms.Page.Preview(ctx, params) (*PagePreviewResponse, error)` **post** `/zones/{zone_id}/waiting_rooms/preview` Creates a waiting room page preview. Upload a custom waiting room page for preview. You will receive a preview URL in the form `http://waitingrooms.dev/preview/`. You can use the following query parameters to change the state of the preview: 1. `force_queue`: Boolean indicating if all users will be queued in the waiting room and no one will be let into the origin website (also known as queueAll). 1. `queue_is_full`: Boolean indicating if the waiting room's queue is currently full and not accepting new users at the moment. 1. `queueing_method`: The queueing method currently used by the waiting room. - **fifo** indicates a FIFO queue. - **random** indicates a Random queue. - **passthrough** indicates a Passthrough queue. Keep in mind that the waiting room page will only be displayed if `force_queue=true` or `event=prequeueing` — for other cases the request will pass through to the origin. For our preview, this will be a fake origin website returning "Welcome". - **reject** indicates a Reject queue. 1. `event`: Used to preview a waiting room event. - **none** indicates no event is occurring. - **prequeueing** indicates that an event is prequeueing (between `prequeue_start_time` and `event_start_time`). - **started** indicates that an event has started (between `event_start_time` and `event_end_time`). 1. `shuffle_at_event_start`: Boolean indicating if the event will shuffle users in the prequeue when it starts. This can only be set to **true** if an event is active (`event` is not **none**). For example, you can make a request to `http://waitingrooms.dev/preview/?force_queue=false&queue_is_full=false&queueing_method=random&event=started&shuffle_at_event_start=true` 6. `waitTime`: Non-zero, positive integer indicating the estimated wait time in minutes. The default value is 10 minutes. For example, you can make a request to `http://waitingrooms.dev/preview/?waitTime=50` to configure the estimated wait time as 50 minutes. ### Parameters - `params PagePreviewParams` - `ZoneID param.Field[string]` Path param: Identifier. - `CustomHTML param.Field[string]` Body param: Only available for the Waiting Room Advanced subscription. This is a template html file that will be rendered at the edge. If no custom_page_html is provided, the default waiting room will be used. The template is based on mustache ( https://mustache.github.io/ ). There are several variables that are evaluated by the Cloudflare edge: 1. {{`waitTimeKnown`}} Acts like a boolean value that indicates the behavior to take when wait time is not available, for instance when queue_all is **true**. 1. {{`waitTimeFormatted`}} Estimated wait time for the user. For example, five minutes. Alternatively, you can use: 1. {{`waitTime`}} Number of minutes of estimated wait for a user. 1. {{`waitTimeHours`}} Number of hours of estimated wait for a user (`Math.floor(waitTime/60)`). 1. {{`waitTimeHourMinutes`}} Number of minutes above the `waitTimeHours` value (`waitTime%60`). 1. {{`queueIsFull`}} Changes to **true** when no more people can be added to the queue. To view the full list of variables, look at the `cfWaitingRoom` object described under the `json_response_enabled` property in other Waiting Room API calls. ### Returns - `type PagePreviewResponse struct{…}` - `PreviewURL string` URL where the custom waiting room page can temporarily be previewed. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) response, err := client.WaitingRooms.Page.Preview(context.TODO(), waiting_rooms.PagePreviewParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), CustomHTML: cloudflare.F("{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Queue all enabled {{/waitTimeKnown}}"), }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", response.PreviewURL) } ``` #### Response ```json { "result": { "preview_url": "http://waitingrooms.dev/preview/35af8c12-6d68-4608-babb-b53435a5ddfb" } } ``` # Events ## List events `client.WaitingRooms.Events.List(ctx, waitingRoomID, params) (*V4PagePaginationArray[Event], error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events` Lists events for a waiting room. ### Parameters - `waitingRoomID string` - `params EventListParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Page param.Field[float64]` Query param: Page number of paginated results. - `PerPage param.Field[float64]` Query param: Maximum number of results per page. Must be a multiple of 5. ### Returns - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Events.List( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.EventListParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": true, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 200, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 1, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Event details `client.WaitingRooms.Events.Get(ctx, waitingRoomID, eventID, query) (*Event, error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events/{event_id}` Fetches a single configured event for a waiting room. ### Parameters - `waitingRoomID string` - `eventID string` - `query EventGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) event, err := client.WaitingRooms.Events.Get( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.EventGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", event.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": true, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 200, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 1, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Create event `client.WaitingRooms.Events.New(ctx, waitingRoomID, params) (*Event, error)` **post** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events` Only available for the Waiting Room Advanced subscription. Creates an event for a waiting room. An event takes place during a specified period of time, temporarily changing the behavior of a waiting room. While the event is active, some of the properties in the event's configuration may either override or inherit from the waiting room's configuration. Note that events cannot overlap with each other, so only one event can be active at a time. ### Parameters - `waitingRoomID string` - `params EventNewParams` - `ZoneID param.Field[string]` Path param: Identifier. - `EventQuery param.Field[EventQuery]` Body param ### Returns - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) event, err := client.WaitingRooms.Events.New( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.EventNewParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), EventQuery: waiting_rooms.EventQueryParam{ EventEndTime: cloudflare.F("2021-09-28T17:00:00.000Z"), EventStartTime: cloudflare.F("2021-09-28T15:30:00.000Z"), Name: cloudflare.F("production_webinar_event"), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", event.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": true, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 200, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 1, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Update event `client.WaitingRooms.Events.Update(ctx, waitingRoomID, eventID, params) (*Event, error)` **put** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events/{event_id}` Updates a configured event for a waiting room. ### Parameters - `waitingRoomID string` - `eventID string` - `params EventUpdateParams` - `ZoneID param.Field[string]` Path param: Identifier. - `EventQuery param.Field[EventQuery]` Body param ### Returns - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) event, err := client.WaitingRooms.Events.Update( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.EventUpdateParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), EventQuery: waiting_rooms.EventQueryParam{ EventEndTime: cloudflare.F("2021-09-28T17:00:00.000Z"), EventStartTime: cloudflare.F("2021-09-28T15:30:00.000Z"), Name: cloudflare.F("production_webinar_event"), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", event.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": true, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 200, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 1, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Patch event `client.WaitingRooms.Events.Edit(ctx, waitingRoomID, eventID, params) (*Event, error)` **patch** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events/{event_id}` Patches a configured event for a waiting room. ### Parameters - `waitingRoomID string` - `eventID string` - `params EventEditParams` - `ZoneID param.Field[string]` Path param: Identifier. - `EventQuery param.Field[EventQuery]` Body param ### Returns - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) event, err := client.WaitingRooms.Events.Edit( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.EventEditParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), EventQuery: waiting_rooms.EventQueryParam{ EventEndTime: cloudflare.F("2021-09-28T17:00:00.000Z"), EventStartTime: cloudflare.F("2021-09-28T15:30:00.000Z"), Name: cloudflare.F("production_webinar_event"), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", event.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": true, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 200, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 1, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 200, "turnstile_action": "log", "turnstile_mode": "off" } } ``` ## Delete event `client.WaitingRooms.Events.Delete(ctx, waitingRoomID, eventID, body) (*EventDeleteResponse, error)` **delete** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events/{event_id}` Deletes an event for a waiting room. ### Parameters - `waitingRoomID string` - `eventID string` - `body EventDeleteParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type EventDeleteResponse struct{…}` - `ID string` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) event, err := client.WaitingRooms.Events.Delete( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.EventDeleteParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", event.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757" } } ``` ## Domain Types ### Event - `type Event struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventTurnstileActionLog EventTurnstileAction = "log"` - `const EventTurnstileActionInfiniteQueue EventTurnstileAction = "infinite_queue"` - `TurnstileMode EventTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventTurnstileModeOff EventTurnstileMode = "off"` - `const EventTurnstileModeInvisible EventTurnstileMode = "invisible"` - `const EventTurnstileModeVisibleNonInteractive EventTurnstileMode = "visible_non_interactive"` - `const EventTurnstileModeVisibleManaged EventTurnstileMode = "visible_managed"` # Details ## Preview active event details `client.WaitingRooms.Events.Details.Get(ctx, waitingRoomID, eventID, query) (*EventDetailGetResponse, error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/events/{event_id}/details` Previews an event's configuration as if it was active. Inherited fields from the waiting room will be displayed with their current values. ### Parameters - `waitingRoomID string` - `eventID string` - `query EventDetailGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type EventDetailGetResponse struct{…}` - `ID string` - `CreatedOn Time` - `CustomPageHTML string` - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `ModifiedOn Time` - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `NewUsersPerMinute int64` - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` - `SessionDuration int64` - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) detail, err := client.WaitingRooms.Events.Details.Get( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.EventDetailGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", detail.ID) } ``` #### Response ```json { "result": { "id": "25756b2dfe6e378a06b033b670413757", "created_on": "2014-01-01T05:20:00.12345Z", "custom_page_html": "{{#waitTimeKnown}} {{waitTime}} mins {{/waitTimeKnown}} {{^waitTimeKnown}} Event is prequeueing / Queue all enabled {{/waitTimeKnown}}", "description": "Production event - DO NOT MODIFY", "disable_session_renewal": false, "event_end_time": "2021-09-28T17:00:00.000Z", "event_start_time": "2021-09-28T15:30:00.000Z", "modified_on": "2014-01-01T05:20:00.12345Z", "name": "production_webinar_event", "new_users_per_minute": 0, "prequeue_start_time": "2021-09-28T15:00:00.000Z", "queueing_method": "random", "session_duration": 0, "shuffle_at_event_start": true, "suspended": true, "total_active_users": 0 } } ``` ## Domain Types ### Event Query - `type EventQuery struct{…}` - `EventEndTime string` An ISO 8601 timestamp that marks the end of the event. - `EventStartTime string` An ISO 8601 timestamp that marks the start of the event. At this time, queued users will be processed with the event's configuration. The start time must be at least one minute before `event_end_time`. - `Name string` A unique name to identify the event. Only alphanumeric characters, hyphens and underscores are allowed. - `CustomPageHTML string` If set, the event will override the waiting room's `custom_page_html` property while it is active. If null, the event will inherit it. - `Description string` A note that you can use to add more details about the event. - `DisableSessionRenewal bool` If set, the event will override the waiting room's `disable_session_renewal` property while it is active. If null, the event will inherit it. - `NewUsersPerMinute int64` If set, the event will override the waiting room's `new_users_per_minute` property while it is active. If null, the event will inherit it. This can only be set if the event's `total_active_users` property is also set. - `PrequeueStartTime string` An ISO 8601 timestamp that marks when to begin queueing all users before the event starts. The prequeue must start at least five minutes before `event_start_time`. - `QueueingMethod string` If set, the event will override the waiting room's `queueing_method` property while it is active. If null, the event will inherit it. - `SessionDuration int64` If set, the event will override the waiting room's `session_duration` property while it is active. If null, the event will inherit it. - `ShuffleAtEventStart bool` If enabled, users in the prequeue will be shuffled randomly at the `event_start_time`. Requires that `prequeue_start_time` is not null. This is useful for situations when many users will join the event prequeue at the same time and you want to shuffle them to ensure fairness. Naturally, it makes the most sense to enable this feature when the `queueing_method` during the event respects ordering such as **fifo**, or else the shuffling may be unnecessary. - `Suspended bool` Suspends or allows an event. If set to `true`, the event is ignored and traffic will be handled based on the waiting room configuration. - `TotalActiveUsers int64` If set, the event will override the waiting room's `total_active_users` property while it is active. If null, the event will inherit it. This can only be set if the event's `new_users_per_minute` property is also set. - `TurnstileAction EventQueryTurnstileAction` If set, the event will override the waiting room's `turnstile_action` property while it is active. If null, the event will inherit it. - `const EventQueryTurnstileActionLog EventQueryTurnstileAction = "log"` - `const EventQueryTurnstileActionInfiniteQueue EventQueryTurnstileAction = "infinite_queue"` - `TurnstileMode EventQueryTurnstileMode` If set, the event will override the waiting room's `turnstile_mode` property while it is active. If null, the event will inherit it. - `const EventQueryTurnstileModeOff EventQueryTurnstileMode = "off"` - `const EventQueryTurnstileModeInvisible EventQueryTurnstileMode = "invisible"` - `const EventQueryTurnstileModeVisibleNonInteractive EventQueryTurnstileMode = "visible_non_interactive"` - `const EventQueryTurnstileModeVisibleManaged EventQueryTurnstileMode = "visible_managed"` # Rules ## List Waiting Room Rules `client.WaitingRooms.Rules.Get(ctx, waitingRoomID, query) (*SinglePage[WaitingRoomRule], error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/rules` Lists rules for a waiting room. ### Parameters - `waitingRoomID string` - `query RuleGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Rules.Get( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.RuleGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "action": "bypass_waiting_room", "description": "allow all traffic from 10.20.30.40", "enabled": true, "expression": "ip.src in {10.20.30.40}", "last_updated": "2014-01-01T05:20:00.12345Z", "version": "1" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Create Waiting Room Rule `client.WaitingRooms.Rules.New(ctx, waitingRoomID, params) (*SinglePage[WaitingRoomRule], error)` **post** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/rules` Only available for the Waiting Room Advanced subscription. Creates a rule for a waiting room. ### Parameters - `waitingRoomID string` - `params RuleNewParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Rules param.Field[RuleNewParamsRules]` Body param - `Action RuleNewParamsRulesAction` The action to take when the expression matches. - `const RuleNewParamsRulesActionBypassWaitingRoom RuleNewParamsRulesAction = "bypass_waiting_room"` - `Expression string` Criteria defining when there is a match for the current rule. - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. ### Returns - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Rules.New( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.RuleNewParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Rules: waiting_rooms.RuleNewParamsRules{ Action: cloudflare.F(waiting_rooms.RuleNewParamsRulesActionBypassWaitingRoom), Expression: cloudflare.F("ip.src in {10.20.30.40}"), }, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "action": "bypass_waiting_room", "description": "allow all traffic from 10.20.30.40", "enabled": true, "expression": "ip.src in {10.20.30.40}", "last_updated": "2014-01-01T05:20:00.12345Z", "version": "1" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Replace Waiting Room Rules `client.WaitingRooms.Rules.Update(ctx, waitingRoomID, params) (*SinglePage[WaitingRoomRule], error)` **put** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/rules` Only available for the Waiting Room Advanced subscription. Replaces all rules for a waiting room. ### Parameters - `waitingRoomID string` - `params RuleUpdateParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Rules param.Field[[]RuleUpdateParamsRule]` Body param - `Action RuleUpdateParamsRulesAction` The action to take when the expression matches. - `const RuleUpdateParamsRulesActionBypassWaitingRoom RuleUpdateParamsRulesAction = "bypass_waiting_room"` - `Expression string` Criteria defining when there is a match for the current rule. - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. ### Returns - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Rules.Update( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.RuleUpdateParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Rules: []waiting_rooms.RuleUpdateParamsRule{waiting_rooms.RuleUpdateParamsRule{ Action: cloudflare.F(waiting_rooms.RuleUpdateParamsRulesActionBypassWaitingRoom), Expression: cloudflare.F("ip.src in {10.20.30.40}"), }}, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "action": "bypass_waiting_room", "description": "allow all traffic from 10.20.30.40", "enabled": true, "expression": "ip.src in {10.20.30.40}", "last_updated": "2014-01-01T05:20:00.12345Z", "version": "1" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Patch Waiting Room Rule `client.WaitingRooms.Rules.Edit(ctx, waitingRoomID, ruleID, params) (*SinglePage[WaitingRoomRule], error)` **patch** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/rules/{rule_id}` Patches a rule for a waiting room. ### Parameters - `waitingRoomID string` - `ruleID string` The ID of the rule. - `params RuleEditParams` - `ZoneID param.Field[string]` Path param: Identifier. - `Action param.Field[RuleEditParamsAction]` Body param: The action to take when the expression matches. - `const RuleEditParamsActionBypassWaitingRoom RuleEditParamsAction = "bypass_waiting_room"` - `Expression param.Field[string]` Body param: Criteria defining when there is a match for the current rule. - `Description param.Field[string]` Body param: The description of the rule. - `Enabled param.Field[bool]` Body param: When set to true, the rule is enabled. - `Position param.Field[RuleEditParamsPosition]` Body param: Reorder the position of a rule - `type RuleEditParamsPositionIndex struct{…}` - `Index int64` Places the rule in the exact position specified by the integer number . Position numbers start with 1. Existing rules in the ruleset from the specified position number onward are shifted one position (no rule is overwritten). - `type RuleEditParamsPositionBefore struct{…}` - `Before string` Places the rule before rule . Use this argument with an empty rule ID value ("") to set the rule as the first rule in the ruleset. - `type RuleEditParamsPositionAfter struct{…}` - `After string` Places the rule after rule . Use this argument with an empty rule ID value ("") to set the rule as the last rule in the ruleset. ### Returns - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Rules.Edit( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.RuleEditParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), Action: cloudflare.F(waiting_rooms.RuleEditParamsActionBypassWaitingRoom), Expression: cloudflare.F("ip.src in {10.20.30.40}"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "action": "bypass_waiting_room", "description": "allow all traffic from 10.20.30.40", "enabled": true, "expression": "ip.src in {10.20.30.40}", "last_updated": "2014-01-01T05:20:00.12345Z", "version": "1" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Delete Waiting Room Rule `client.WaitingRooms.Rules.Delete(ctx, waitingRoomID, ruleID, body) (*SinglePage[WaitingRoomRule], error)` **delete** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/rules/{rule_id}` Deletes a rule for a waiting room. ### Parameters - `waitingRoomID string` - `ruleID string` The ID of the rule. - `body RuleDeleteParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) page, err := client.WaitingRooms.Rules.Delete( context.TODO(), "699d98642c564d2e855e9661899b7252", "25756b2dfe6e378a06b033b670413757", waiting_rooms.RuleDeleteParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### Response ```json { "errors": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "messages": [ { "code": 1000, "message": "message", "documentation_url": "documentation_url", "source": { "pointer": "pointer" } } ], "success": true, "result": [ { "id": "25756b2dfe6e378a06b033b670413757", "action": "bypass_waiting_room", "description": "allow all traffic from 10.20.30.40", "enabled": true, "expression": "ip.src in {10.20.30.40}", "last_updated": "2014-01-01T05:20:00.12345Z", "version": "1" } ], "result_info": { "count": 1, "page": 1, "per_page": 20, "total_count": 2000 } } ``` ## Domain Types ### Waiting Room Rule - `type WaitingRoomRule struct{…}` - `ID string` The ID of the rule. - `Action WaitingRoomRuleAction` The action to take when the expression matches. - `const WaitingRoomRuleActionBypassWaitingRoom WaitingRoomRuleAction = "bypass_waiting_room"` - `Description string` The description of the rule. - `Enabled bool` When set to true, the rule is enabled. - `Expression string` Criteria defining when there is a match for the current rule. - `LastUpdated Time` - `Version string` The version of the rule. # Statuses ## Get waiting room status `client.WaitingRooms.Statuses.Get(ctx, waitingRoomID, query) (*StatusGetResponse, error)` **get** `/zones/{zone_id}/waiting_rooms/{waiting_room_id}/status` Fetches the status of a configured waiting room. Response fields include: 1. `status`: String indicating the status of the waiting room. The possible status are: - **not\_queueing** indicates that the configured thresholds have not been met and all users are going through to the origin. - **queueing** indicates that the thresholds have been met and some users are held in the waiting room. - **event\_prequeueing** indicates that an event is active and is currently prequeueing users before it starts. - **suspended** indicates that the room is suspended. 1. `event_id`: String of the current event's `id` if an event is active, otherwise an empty string. 1. `estimated_queued_users`: Integer of the estimated number of users currently waiting in the queue. 1. `estimated_total_active_users`: Integer of the estimated number of users currently active on the origin. 1. `max_estimated_time_minutes`: Integer of the maximum estimated time currently presented to the users. ### Parameters - `waitingRoomID string` - `query StatusGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type StatusGetResponse struct{…}` - `EstimatedQueuedUsers int64` - `EstimatedTotalActiveUsers int64` - `EventID string` - `MaxEstimatedTimeMinutes int64` - `Status StatusGetResponseStatus` - `const StatusGetResponseStatusEventPrequeueing StatusGetResponseStatus = "event_prequeueing"` - `const StatusGetResponseStatusNotQueueing StatusGetResponseStatus = "not_queueing"` - `const StatusGetResponseStatusQueueing StatusGetResponseStatus = "queueing"` - `const StatusGetResponseStatusSuspended StatusGetResponseStatus = "suspended"` ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) status, err := client.WaitingRooms.Statuses.Get( context.TODO(), "699d98642c564d2e855e9661899b7252", waiting_rooms.StatusGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", status.EventID) } ``` #### Response ```json { "result": { "estimated_queued_users": 0, "estimated_total_active_users": 0, "event_id": "25756b2dfe6e378a06b033b670413757", "max_estimated_time_minutes": 0, "status": "queueing" } } ``` # Settings ## Get zone-level Waiting Room settings `client.WaitingRooms.Settings.Get(ctx, query) (*SettingGetResponse, error)` **get** `/zones/{zone_id}/waiting_rooms/settings` Get zone-level Waiting Room settings ### Parameters - `query SettingGetParams` - `ZoneID param.Field[string]` Identifier. ### Returns - `type SettingGetResponse struct{…}` - `SearchEngineCrawlerBypass bool` Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) setting, err := client.WaitingRooms.Settings.Get(context.TODO(), waiting_rooms.SettingGetParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", setting.SearchEngineCrawlerBypass) } ``` #### Response ```json { "result": { "search_engine_crawler_bypass": true } } ``` ## Update zone-level Waiting Room settings `client.WaitingRooms.Settings.Update(ctx, params) (*SettingUpdateResponse, error)` **put** `/zones/{zone_id}/waiting_rooms/settings` Update zone-level Waiting Room settings ### Parameters - `params SettingUpdateParams` - `ZoneID param.Field[string]` Path param: Identifier. - `SearchEngineCrawlerBypass param.Field[bool]` Body param: Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics. ### Returns - `type SettingUpdateResponse struct{…}` - `SearchEngineCrawlerBypass bool` Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) setting, err := client.WaitingRooms.Settings.Update(context.TODO(), waiting_rooms.SettingUpdateParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", setting.SearchEngineCrawlerBypass) } ``` #### Response ```json { "result": { "search_engine_crawler_bypass": true } } ``` ## Patch zone-level Waiting Room settings `client.WaitingRooms.Settings.Edit(ctx, params) (*SettingEditResponse, error)` **patch** `/zones/{zone_id}/waiting_rooms/settings` Patch zone-level Waiting Room settings ### Parameters - `params SettingEditParams` - `ZoneID param.Field[string]` Path param: Identifier. - `SearchEngineCrawlerBypass param.Field[bool]` Body param: Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics. ### Returns - `type SettingEditResponse struct{…}` - `SearchEngineCrawlerBypass bool` Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics. ### Example ```go package main import ( "context" "fmt" "github.com/cloudflare/cloudflare-go" "github.com/cloudflare/cloudflare-go/option" "github.com/cloudflare/cloudflare-go/waiting_rooms" ) func main() { client := cloudflare.NewClient( option.WithAPIToken("Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY"), ) response, err := client.WaitingRooms.Settings.Edit(context.TODO(), waiting_rooms.SettingEditParams{ ZoneID: cloudflare.F("023e105f4ecef8ad9ca31a8372d0c353"), }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", response.SearchEngineCrawlerBypass) } ``` #### Response ```json { "result": { "search_engine_crawler_bypass": true } } ``` ## Domain Types ### Setting - `type Setting struct{…}` - `SearchEngineCrawlerBypass bool` Whether to allow verified search engine crawlers to bypass all waiting rooms on this zone. Verified search engine crawlers will not be tracked or counted by the waiting room system, and will not appear in waiting room analytics.