Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
For known issues or limitations in the current version of Link11 WAAP.
Link11 offers a network security software suite, including robust WAAP (Web Application and API Protection). This is the documentation for the Link11 WAAP ("L11WAAP") SaaS system.
Available .
The manual is organized into the following sections, accessible through the sidebar table of contents:
Introduction to Link11 WAAP: general information about the system and its capabilities
How It Works: an overview of how L11WAAP filters traffic
Console UI Walkthrough: a detailed explanation of the user interface
Using the Product: some tips and best practices
Reference Information
Product overview, architecture, and how it works
Link11 offers an all-in-one WAAP platform. It includes a next-gen Web Application Firewall (WAF), autoscaling Denial of Service (DoS)/Distributed Denial of Service (DDoS) protection, advanced bot management, real-time traffic monitoring & control, full historical logs & analytics, and more.
Link11 WAAP runs on the customer’s clouds of choice, whether the Link11 Network and Web Security solution, or any of the top-tier public cloud providers (AWS, Azure, and GCP). It protects web applications, services and microservices, and API endpoints.
L11WAAP deploys as a reverse proxy, continually analyzing incoming traffic. Benign traffic is passed through to the customer's origin, while hostile traffic is blocked and denied access.
The platform's overall architecture is as follows:
L11WAAP deploys and runs in the customer's choice of clouds, whether private (Link11) or public (AWS, GCP, or Azure).
All incoming traffic is routed through L11WAAP and scrubbed as it passes through. Latency is negligible (generally 1.5 milliseconds or less).
Hostile traffic is blocked before it reaches the protected network. Legitimate traffic has normal access to the requested resources.
L11WAAP is integrated with, and runs natively on, multiple cloud platforms. It leverages the advantages of each. Examples:
When L11WAAP runs on Link11, customers can use Secure CDN, Link11 load balancing, Infrastructure DDoS for offloading Layer 3 protection, and more.
On GCP, L11WAAP can act as the 'threat detection engine' for Cloud Armor, automating and extending its capabilities, and blocking attacks at the edges.
On Azure, L11WAAP integrates with Azure Security Center to fit smoothly into existing customer workflows.
On AWS, L11WAAP integrates with AWS WAF and Shield, adding granularity, control, and many other additional capabilities to AWS's native security features.
This section provides settings for content filtering:
An optional feature
DNS Management is an optional capability. Your DNS records do not need to be maintained within Link11, but they can be.
The user interface displays the records that are currently defined within Link11 WAAP. These records are not editable within the UI; they are configured outside of the UI, and are displayed here for informational purposes only.
For assistance in changing or configuring DNS records, within L11WAAP, .
This section describes best practices for some common tasks.
A task-based FAQ
This section answers questions that often arise about using Link11 WAAP.
Sometimes it is desirable to add custom annotations to events in the traffic logs: perhaps for monitoring, visibility, or other purposes.
This can be done with .
Link11 WAAP includes a Mobile SDK for authenticating mobile application clients. For more information, see .
Sometimes end-to-end encryption is necessary, and client traffic must be kept encrypted until it reaches the backend server.
For this purpose, Link11 supports TCP passthrough. When this is configured, neither the Link11 load balancer nor L11WAAP will terminate or decrypt the TCP connection. The specified traffic will be passed through to the backend as-is.
Caution: If TCP passthrough is enabled, we recommend using it with the narrowest possible scope. This traffic is not decrypted, and therefore, cannot be inspected by Link11.
Passed-through requests are not filtered for hostile content, rate limit violations, ACL enforcement, etc. They also are not logged by Link11.
Web clients can cache resources from a server. Afterwards, a client can access its local cache, which reduces the number of requests sent to the server.
Servers can instruct clients to implement caching in certain ways. Servers can also set separate caching policies for any intermediary proxies in-between the server and the client.
Link11 WAAP is a proxy between the clients and the backend. When the backend responds to clients, the outgoing responses pass through L11WAAP. You can instruct the system to preserve or alter the caching instructions in those responses.
This can be done through . Out of the box, L11WAAP includes several cache policy Edge Functions for this purpose. If you need additional assistance in customizing L11WAAP's caching behavior, .
When a web application or API frequently receives incoming requests with excessively large arguments, or a large number of arguments, this can adversely impact the performance of the Events Log.
To address this, Link11 WAAP can defer the retrieval of arguments until an admin specifically requests it. More info on this feature is .
Link11 WAAP provides inherent capabilities for load-balancing across origin/backend servers.
This is configured in .
To run custom Lua code before or after Link11 WAAP processes a request, use an .
To define code for customizing nginx's behavior or parameters, use .
Link11 WAAP integrates with a wide range of SIEM [Security Information and Events Management] solutions. Most of our enterprise clients stream L11WAAP events to ArcSight, RSA, IBM, Splunk, and other solutions.
To stream traffic event data to one or more of these destinations, create one or more .
The lengths of Log Exporter data values can be controlled using the .
Bandwidth, compute, and other resources scale automatically as needed.
Remote management ensures minimal obligations (of time or expertise) from onsite staff.
L11WAAP supports various methods of authentication such as Basic, Digest, and Kerberos. (Note that NTLM cannot work with reverse proxies, and thus L11WAAP does not support NTLM sites/applications.)


Blocked requests can receive customized response headers, status codes, and content, by configuring the appropriate Actions.
Admins can also run custom Lua code via Edge Functions. Edge Functions with a phase of Response Pre Processing or Response Post Processing will be run after the backend has responded to the request, but before the response is sent to the client.
Sometimes, incoming requests contain sensitive or Personally Identifiable Information that should not be included in logs and other forms of analytics.
Link11 WAAP provides the ability to mask specific types of information. This is configured using the Masking Seed and Mask? fields within Content Filter Profiles.
Note that you should ensure that the relevant requests are always subjected to the Content Filtering process.
The Analytics section contains the UI for viewing traffic.
If you have not used Link11 WAAP before, read this first: Traffic Reporting and Analytics.
Otherwise, the Analytics UI is documented here:
The Security section of the UI provides configuration options for basic security rulesets and policies. The pages in this section document the configuration for these security settings.
If you are not yet familiar with how Link11 WAAP filters traffic, and how the various settings below fit into this process, it is recommended that you read this overview first: The traffic filtering process.
Content Filter:
Display and manage the list of quarantined traffic sources
The Quarantined List page shows a list of traffic sources that have triggered one or more Dynamic Rules. While a traffic source is on this list, Link11 WAAP responds to all of its requests automatically with the Dynamic Rule's Action.
This is often used to ban a persistent violator of other security rulesets, but it can also be used merely to monitor a traffic source for a period of time. An explanation of the quarantining process is here.
Each quarantined traffic source will have an entry in the list. Long lists will be broken up across multiple pages, which can be navigated using the controls at the bottom of the page.
The overall list can be sorted according to the values in each column by using the Filter control at the top.
Traffic sources will be automatically removed from the Quarantine list when their quarantines have expired.
They can also be manually deleted. In the UI, this is done by selecting the trash icon at the end of an entry in the Quarantined List.
When a traffic source is manually deleted from the list, L11WAAP understands this to mean that the quarantine was a False Positive.
Therefore, when the next cycle of Dynamic Rule evaluation occurs, the Rule's corresponding Global Filter will be updated by removing the traffic source from its Rule list. Subsequent requests from that traffic source will not automatically receive the Rule's Tags and Action., unless/until that traffic source violates the Dynamic Rule again.
To exempt the traffic source from further Dynamic Rule enforcement, an admin should add appropriate tag(s) to the Dynamic Rule's Exclude list.
This section of the console contains the following options:
Server Groups: properties of server(s) for sites(s).
Backend Services: the services that L11WAAP is protecting.
Edge Functions: for running custom Lua code.
: information about DNS configuration.
: managing SSL associated with load balancers.
: for managing SSL certificates.
Security Alerts allow admins to configure email alerts to be sent when Dynamic Rules are triggered.
Security Alerts operate at the system level. They can be defined for individual , or for multiple Server Groups simultaneously. When any of the specified Dynamic Rules is triggered for any of the specified Server Groups, an email alert will be sent to the designated recipient(s).
Each email alert includes:
The Dynamic Rule that was triggered: its name, description, "Limit" (a combination of the Rule's Number of events and Time frame), and "Type" (which corresponds to the Rule's setting)
A list of the violators of that Rule
The main window (shown above) lists all currently defined Security Alerts.
The administration (addition/deletion/editing/versioning) of these Alerts follows the conventions described .
The name of this Security Alert, for use within the interface.
The Server Group(s) for which this Security Alert will be active.
One or more recipients (specified as email addresses, separated by commas) to receive alerts when any of the listed Dynamic Rules are triggered.
One or more Dynamic Rules which will, when violated, trigger the sending of email alerts to the specified recipients.
Whenever you change the configuration of the Link11 WAAP platform within the UI, you must save your changes, and you must publish them to the cloud as well.
If you do not save your changes, they will be lost when you go to a different page within the user interface. You will not be prompted or asked to confirm the abandonment of your changes.
The various Editor pages within the UI have "Save" buttons in the top row of controls. Select this button to save whatever changes have been ma.de
Note that the "Save" button only saves your changes within your local session. To push them to your planet in the cloud, you must publish the changes as well.
Follow the process described here: .
Sometimes an admin needs to bypass the WAAP's traffic filtering, for example when "attacking" an application or server as part of a loadtest. Under normal circumstances, L11WAAP would prevent this, because it would enforce rate limits and block the excessive requests from reaching the backend.
Specific requests can be exempted from L11WAAP's traffic filtering (including rate limiting) by:
Creating a Global Filter with narrowly-defined Rules (which will only match those specific requests, and no others)
Selecting the Global Filter's Action to be one of type Skip
And ideally, defining a unique to assign to those requests, so they will be identifiable in the traffic logs.
Incoming requests that meet the criteria for the Global Filter will not subjected to filtering. They will be passed directly through to the backend.
Scenario: An admin has recently created a new section within an existing domain. (In this context, "section" means a path, or set of paths, that can be described in a single regex.) For example, perhaps a new API version is being exposed at /apiv3, which is a URL that did not previously exist.
How can the admin configure Link11 WAAP's security settings for the new path(s)?
As shown in the diagram below, the association between security settings and paths is done within a Security Policy.
Specifically, each Security Policy contains a Path Map: a list of paths, and the security settings assigned to each.
Thus, the process for configuring new paths within L11WAAP is as follows:
Determine the Security Policy currently in place for the domain
Within that Security Policy, clone an existing Path Map
Configure the new Path Map as appropriate, to contain the new settings.
These steps are described below.
Navigate to Sites -> Server Groups.
In the list that appears, select the for the domain in question.
On the Server Group Editor page, note the current selection in the Security Policy pulldown list.
Navigate to Security -> Security Policies
Select the Security Policy that is (as noted above) currently assigned to the domain's Server Group.
At the bottom of the Security Policies Editor page is the Path Mapping section. Expand one of the entries in this list.
Within the expanded display of the Path Map, at the bottom right, select the Fork Path Mapping
Ensure that the new Path Map is displayed for editing, and then:
Edit its Name to something appropriate
Define the Match path with an expression that will match all the new path(s) being configured
Verify that the other security settings in this Path Map are appropriate. If not, existing security rulesets (such as Rate Limit Rules, Content Filter Profiles, etc.) are available for selection. If it is necessary to create one or more new rulesets, you will need to leave this page (be sure to select Save first!), create the new settings, and return here to select them.
By default, Link11 WAAP will block GraphQL traffic, for two reasons:
The size of the argument
number 600110, which contains this Match string: ([$@{}()\[\]].*){8,})
To allow GraphQL traffic, create a with:
An Argument Max Length that will accommodate the maximum size of the queries
This tag in the Ignore Content Filter Tags list: cf-rule-name:600110
Then assign this Content Filter Profile to the location (i.e., the site or path) of the GraphQL queries via an appropriate .
This section of the console is for system-wide configuration.
: one of Link11 WAAP's mechanisms for human verification.
: for managing Single Sign-On for L11WAAP
: for clearing the cache(s) of Content Delivery Network nodes
Link11 WAAP maintains Git versions of data and configurations.
This page displays previous versions of configurations, and allows admins to:
Download a version by using the "Download" button at the top
Revert/restore the system to any saved configuration.
To revert/restore, hover the cursor over the desired configuration. The "Restore"
This page pushes a selected system configuration to the proxy, and makes it active. This is necessary when:
Edits were recently made to the current configuration
Changing to a different system configuration on the page: either reverting to a previous version, or rolling forward to one that's different than the currently active one.
If the user is logged into the planet directly (i.e., without using SSO), then selecting the user icon () at the top right of the UI will display a menu, including an option for opening the Account Details page.
This page displays the account details of the current user, allows configuration of MFA (multi-factor authentication), and provides keys for using the API. Its sections are described below.
The section shows a list of traffic sources (i.e., sources of incoming requests) that are currently banned, blocklisted, and allowlisted.
A traffic source is banned automatically when it violates a .
You cannot manually move a traffic source into quarantine. Instead, you can create a Dynamic Rule to do it for you. The Dynamic Rule's parameters should be as follows:
By default, Link11 supports communication between customer backends and .
When a backend system requests a new or renewed certificate from LE, Let's Encrypt responds initially with a challenge. Because Link11 WAAP is a proxy for the backend, this challenge will be sent to L11WAAP.
Under normal circumstances, L11WAAP will forward this to the customer system. If this is not occurring, something in L11WAAP's default configuration might have been changed.
To correct this, perform the following two-step process.
Under most circumstances, a session over unencrypted HTTP should not be accepted. Using Link11 WAAP, admins can refuse HTTP requests by either:
Redirecting them to HTTPS
Or simply blocking them.
Admins must also choose whether to refuse HTTP traffic:
Globally, throughout the entire planet, or
Link11 WAAP maintains most of its security parameters as Entries, which are contained in Documents, which are contained in Configurations.
A Configuration is a complete definition of L11WAAP's behavior for a specific environment. An organization can maintain multiple Configurations (e.g., development, staging, and production).
Each Configuration contains multiple Documents of various types (Global Filters, ACL Profiles, etc.) Each Document contains at least one Entry, i.e., an individual security rule or definition.
A Configuration also includes data blobs, which currently are used to store the geolocation database. This is where L11WAAP obtains its geolocation data and ASN for each request it processes.
Restricting consumption of resources and rate of requests
Different types of rate limits are defined in different parts of the Link11 WAAP interface.
Static rate limits for entire sites/applications: A static rate limiting capability is available via the within . This is simple, IP-based rate limiting that applies globally to every site/application based upon that Proxy Template.
Granular rate limiting: More powerful capabilities are available through , including variable scope, multiple criteria for tracking requestors, actions, and more. These Rules are then associated with specific locations/URLs through .
Global enforcement by traffic source: Requestors who submit excessive requests across the planet can be banned for configured lengths of time. This can be done via .
Link11 WAAP includes an API that provides full coverage of the system's capabilities.
Using the API will require familiarity with the following:
L11WAAP's
The API's namespaces and endpoints, which are documented in two locations:
In the reference section of this manual
Security Alerts: for configuring email alerts, sent when Dynamic Rules are triggered
Log Exporters: for exporting traffic event data, e.g. to a SIEM solution
Version Control: for rolling forward/back to a different configuration
System DB: for accessing system settings
Publish Changes: for publishing configuration changes to proxies
It should be active (in other words, the Inactive toggle should not be selected).
Target should be set to IP
Number of events should be 0
Action should be a blocking action (e.g., Dynamic-rule block)
Quarantine Time should be the length of time you wish the ban to last
The Exclude list should be empty
The Include list should not contain all
The Include list should contain the tag(s) that will uniquely identify requests coming from the traffic source.
Manually removing a requestor from quarantine is discussed here: Cancelling quarantines and preventing False Positives.
To exempt a traffic sources from potential quarantine, add identifying tags to the Exclude list in the active Dynamic Rules.
To exempt a traffic source from other stages of filtering, do one of the following:
To bypass all stages of filtering, follow the steps described here: Bypass Link11 WAAP for Loadtesting or Other Purposes.
To exempt requests only from bot challenges or content filtering, configure an ACL Profile with appropriate tag(s) in the Bypass list, then use a Security Policy to assign that ACL Profile to the desired paths/URLs.
To exempt requests only from bot challenges, configure an ACL Profile with appropriate tag(s) in the Bot Challenge / Skip list, then use a Security Policy to assign that ACL Profile to the desired paths/URLs.
In Swagger UI. Along with documenting the API, this also includes the ability to submit API calls directly to your planet. (more info)
(Optional) the process for accessing the API using curl.
Once the restoration process is complete, publish. L11WAAP will push the selected configuration out to the proxy.

Whenever you change the configuration of the Link11 WAAP platform, you must save your changes. This is done with the "Save" button, available at the top of many pages within the UI.
If you do not save your changes, they will be lost when you go to a different page within the user interface. You will not be prompted or asked to confirm the abandonment of your changes.
After saving the changes, you must publish them as well, to push the changes out to the cloud. This is done by coming to this page and selecting the "Publish" button.
When you first arrive on this page, the most recent commit is automatically selected, so it is the one that is published when the button is selected. The most recent commit will include all of the changes that were made and saved.
After working with Version Control, you must come to this page, select the desired Commit entry (hovering the cursor over an entry will show the Select button), and select the "Publish" button on the top right.
To set the system to a different commit, follow these steps:
In the pulldown at the top left of the sidebar menu, ensure that the appropriate Target Bucket(s) are selected. (The list of buckets is maintained in the System DB.)
The Commit list is a list of configurations, with the most recently edited version at the top. If you wish to publish your most recent edits, ensure that the top entry is selected. If instead you wish to revert to a previous entry, find it in the list and select it.
Select the "Publish" button on the top right.

All of these data structures can be edited via API:
A Document is a file treated as a JSON list of entries.
An Entry is a JSON dictionary with a unique identifier. This field value must be unique inside the Document, and must be a valid part of an URL. Often, this field is labeled id (for example, configurations). At other times, it has a specific name (for example, Routing Profiles use the field planet_name.)
A blob is a file treated as binary data.
The Configuration is the atomic unit for all of L11WAAP's parameters. Any edits to a Configuration result in a new Configuration being created. Configurations are versioned, and can be reverted at any time.
Most API calls require a parameter for the configuration (typically listed as {config}), representing the configuration id.
When a Configuration is created or modified (whether by the UI console or an API call), the admin must push the changes out to the planet. This is the publishing process.

The name, email address, phone number, and organization of the current user are shown here.
For most users, their account details on this page are read-only. Editing is available through the Users Management page.
Users that are Organization Administrators can edit their name and phone number here.
This section provides for setup of MFA (multi-factor authentication). It contains a QR code that can be scanned, to obtain an OTP (one-time password) via Google Authenticator, Authy, or other authentication platforms.
At the bottom of this section, there are links to authentication apps for iOS and Android.
This section displays the current API Keys. Multiple keys can be defined.
To add a key, select + New. Specify a title for the new key.
To revoke an existing key, hover the cursor over it and select the trash can icon.




This Dashboard provides analytics that reveal their activity and composition of AI crawler activity. It is divided into three sections, in this order (top to bottom):
The date/time range for the analytics display, similar to the Query Specification section of the main analytics Dashboard.
A graphical summary of all crawler activity for the specified time range. Dragging the cursor over a portion of the chart will adjust the display to focus only on this time period.
Activity by individual crawlers, and the disposition of their requests.
The AI Management Dashboard is for displaying crawler activity.
The crawlers' activity can also be managed; this is configured in a different part of L11WAAP, based on a dedicated set of Global Filters that identify them.
To control crawler activity within the protected systems, two approaches can be taken, depending on the desired scope.
To globally block all requests for a specific crawler, edit the appropriate Global Filter and set its Action parameter to Global filter block. For example, the AI ChatGPT Filter can be used to block ChatGPT's crawler.
To block or otherwise manage AI bot requests for specific parts of the system, follow this procedure:
Open the appropriate Global Filter for editing (the one which identifies the crawler in question).
Ensure that the Filter’s Action parameter is set to monitor (tag only).
In the Filter’s Tags field, note the specific tag that the system will attach to all requests generated by the crawler. Or, you can define your own.
Next, for each part of the protected system where crawler activity should be controlled, determine the that is in effect. (ACL Profiles are assigned to paths by .)
Add the crawler’s Tag to the appropriate column within each ACL Profile. (To block the requests, the Enforce Deny column can be used.)
Sometimes it is desirable to set up unique management for visitors that originate from AI services.
Link11 includes specific "Referral" Global Filters for this purpose. For example, the AI ChatGPT Referral Filter will match every request that has its referer header set to https://chatgpt.com/.
Using the procedures explained above, these Filters can be used to block, or trigger other specific handling, of these requests.

For Link11 load balancers supporting a multi-regional or multi-cluster planet, configuring the preferred traffic routing (optional).
You can select or change the SSL certificate attached to a load balancer. Selecting the Attach Certificate button displays this dialog:
The certificates available for selection are those defined within the SSL Certificate list.
When a public-cloud load balancer is used, Link11 automatically routes traffic to the customer planet for processing.
When Link11 cloud load balancing is used, and the customer planet has multiple clusters or spans geographic regions, admins have additional control over traffic routing.
For each load balancer, admins can specify the preferred datacenter, i.e. the preferred regional instance of Link11 WAAP to scrub the traffic.
The UI offers the selection of one Preferred datacenter; this will be the destination for traffic from all locations where that load balancer is running.
If more granularity is needed, the API can be used to set a different preference for each location.
When traffic is received, the system will route the traffic as follows:
If a Preferred datacenter was selected, and that datacenter is up, it receives the traffic.
If a Preferred datacenter was selected, but that datacenter is currently down, traffic is balanced across all available datacenters.
If a Preferred datacenter was not selected, traffic is sent to the datacenter closest to the load balancer.
In certain situations, a single client session might be processed in more than one datacenter.
This can occur when Frankfurt is the destination for traffic. In the interface, "Frankfurt" represents two physical datacenters in the Frankfurt region. The system can send traffic to either one.
This can also occur when a preferred datacenter is, or becomes, unavailable. The system will route its traffic elsewhere, as described above, but will continue monitoring the preferred datacenter. Once it becomes available, traffic will be routed there again.
When a client session is processed by multiple datacenters, this has no impact on analytics or most traffic scrubbing. However, it can delay enforcement of Rate Limit Rules, because each datacenter will only have processed a subset of the client's requests.

Confirm that there is a Global Filter named Let's Encrypt Requests.
Confirm that this Filter:
is in Active mode
will add a tag of let-s-encrypt
has an Action of monitor (tag only)
contains a single entry, with Category set to URI and Match set to ^/\.well-known/(acme-challenge|rbz-traffic)/[A-Za-z0-9_-]+$
If any edits were performed as a result of the above, save them and publish.
The Global Filter described above will add a tag of let-s-encrypt to challenges from LE.
To ensure that this traffic is passed through L11WAAP to the customer backend:
Ensure that this tag is in the Ignore field in every Content Filter Profile. During this process, if a Profile is edited, ensure that the changes are saved.
After all Profiles have been checked, publish the changes (if any were made).
If the process above is followed, and Let's Encrypt traffic is still being blocked by L11 WAAP, check the LE requests in the Events Log to discover the reason(s) for this.
Note that the passthrough of Let's Encrypt requests does not occur until the Content Filtering stage of the traffic filtering process. This means that several stages of filtering are still performed before the passthrough can occur. If legitimate requests from Let's Encrypt are tagged with let-s-encrypt but are still being blocked, use the Events Log entries to determine the source of the blocking action, and then correct the security settings that are responsible for this.
Feel free to for assistance with any part of the process described above.
Selectively, to certain paths within the planet.
This can all be done with a single Global Filter.
Create a Global Filter with these parameters:
Name and Description: as desired
Active mode: enabled
Source: self-managed
Tags: as desired, perhaps something descriptive such as http-received
The Global Filter's Action setting determines what will happen to the request.
To block the request completely, choose a blocking Action (perhaps the default Global filter block Action).
To redirect the HTTP request to HTTPS, you can select the default https redirect Action (shown below). If you choose to edit this Action or use a different one, ensure that the selected Action has the same Status code, and the same setting for the location header.
Within the Rule list, select +New Entry. Populate the new entry with:
Category set toTag
Match set toprotocol:http
Whatever Annotation you wish.
At this point, the Global Filter should look something like this:
By following the steps above, you have a Global Filter that will block or redirect HTTP traffic globally, throughout the entire planet.
If this was your goal, skip down to the Saving and Publishing steps below.
If instead you only want to apply this Global Filter to certain paths within the planet, you must create one or more additional entries in the Rule list. Each should have:
Category set toPath
Match set to a regex describing the path
Whatever Annotation you wish.
Create as many entries as necessary to include all the desired paths.
Note that these entries should all be within the same section as the first Tag entry. (If instead you selected +New section, and the entries are now in separate sections, ensure that the relation between them is set to Relation: AND.)
When you have completed the steps above, the Global Filter has been created.
Select Save, and then publish the changes.
Using Swagger UI will require the user to be logged into the planet with a sufficient Access Level.
If Swagger UI receives a request and the response is an HTML document, the most likely cause is the user is not logged in, or is logged in with insufficient permissions.
The Swagger interface shows the namespaces and data models for the API. Often, each one is initially collapsed, as in this example:
Expanding a namespace reveals the endpoints within it:
Expanding an endpoint reveals more information about required inputs (if any) and the information that will be returned in the response.
Some endpoints, as in the example above, do not require any inputs. Others require specific parameters:
... or other inputs, such as a request body.
Selecting the Try it out button will enable the editing of the required inputs, if any. Once the required inputs have been completed, the system will:
display a command that can be submitted via curl (as explained here), and
display an Execute button, which if selected will submit the command to the system and display the results.
Swagger allows you to interact with the API, try different commands, and see what responses will be generated.
To exempt one or more traffic sources from all filtering, follow the instructions here: Bypass Link11 WAAP for Loadtesting or Other Purposes.
To exempt a traffic source from rate limiting only, do the following:
Determine a unique tag that will identify the traffic source(s).
There might already be one in use by the system. For example, to exempt an entire ASN, the system tag for that ASN can be used.
If not, then create a Global Filter that will assign a unique tag to requests from the traffic source(s) in question.
Add the tag to the Exclude filter list in the applicable and .
Link11 WAAP includes a Mobile SDK: a unique client certification mechanism for iOS and Android apps. Customers can publish their applications with the SDK embedded.
In use, the SDK signs the application, authenticates the device, and verifies user identity, adding a cryptographic HMAC signature to each request. The SDK provides a reliable and secure mechanism to confirm that the traffic is originating from a legitimate app user and not a bot or emulator.
The latest version of the Mobile SDK, including instructions and code samples, is available here:
Below, we discuss the parameters to configure within L11WAAP for receiving requests from mobile applications.
A Mobile Application Group configures Mobile SDK parameters for a specific (which usually represents a domain).
The main window (shown above) lists all currently defined Mobile Application Groups.
The administration (addition/deletion/editing/versioning) of these Groups follows the conventions described .
The name of this Mobile Application Group, for use within the interface.
A description of this Mobile Application Group, for use within the interface.
The name of the header that contains the user authentication token. This can be left blank.
The allowable time between the timestamp of a request and the time that L11WAAP receives the request from the application. Requests with a longer delay will be rejected.
This list contains the SHA-256 digests of recognized certificates.
To find the signature for an iOS app, you can open the Apple Development Certificate in the Keychain app, and copy the SHA-256 fingerprint. Alternatively, you can this fingerprint from the ipa bundle.
For Android app, you can get the SHA-256 fingerprint from the keystore or extract it from a signed APK with the apksigner tool (part of the Android SDK). See detailed instructions .
When uploading the fingerprint to the L11WAAP Console, make sure that it contains hexadecimal characters only, in lowercase, without spaces.
Any number of signatures may be 'Active' at given time.
This lists the remote profiles that can override the parameters of the SDK on all mobile clients.
The Default profile is always empty. When it is active, the SDK parameters are fully determined by the app's local configuration. Only one remote profile may be active at a given time.
Link11 WAAP contains several mechanisms for detecting bots within web traffic, including Active Challenges and Passive Challenges.
This page allows admins to configure the third mechanism: the L11WAAP Interactive Challenge, which is a form of CAPTCHA ("Completely Automated Public Turing test to tell Computers and Humans Apart").
The Interactive Challenge is more stringent than the other mechanisms. Therefore, when an Interactive Challenge is triggered, the user must pass it before being allowed to continue, even if the user had previously passed an Active Challenge or Passive Challenge.
The Interactive Challenge defined on this page can be used at various places within a web application. Create one or more with the Type parameter set to Interactive Challenge, and then use the Action(s) within the appropriate security rulesets (within , , , and ).
Admins should ensure that rulesets which can trigger Interactive Challenges are not applied to API endpoints. Interactive Challenges require user interaction, and therefore, API clients cannot pass them.
The parameters described below will determine how the Interactive Challenge page is displayed to the user.
The direction of the text displayed to the user. For example, English should be set to Left to right, while for Hebrew, this should be set to Right to left.
This specifies how to display the image configured in the Image/IMG settings within the Languages section. When set to Logo, the image will be shown on the page once. When set to Wallpaper, the image will be tiled to fill the page.
The colors used in the challenge.
Admins can configure Interactive Challenges in different languages. A default L11WAAP deployment will contain English; to add additional languages for configuration, select New language. (This appears below the Languages section; you can collapse the section to make it more accessible.)
Each configured language will include the options below.
The title that will be shown on the page.
During the Interactive Challenge, two buttons are shown to the user. The top field specifies the text for the first button that appears, and the bottom field specifies the text for the second button.
This is the source for the image that will be shown on the Interactive Challenge page. It will be shown according to the Style setting.
This displays a preview of the image specified in the Image Element Source.
To see how an interactive challenge will appear to a user, you can select it as the Action for a dedicated : one with a Rule list that will only match a test request (e.g., a specific IP that you will use to test the challange).
This feature allows admins to purge CDN caches at various scopes:
The entire planet
Specific domain(s) within the planet
Specific paths within domain(s)
A history of current and past activity is provided.
This feature is available when at least one CDN has been set up in the system. (To do this, contact customer support.) If no CDN is currently configured, an error message will be shown.
Purging requires these steps:
Select the cache(s)
Initiate the purge
(Optional) monitor the results
Cache selection varies, depending on the CDN being used.
For non-AWS CDNs, at the top left of the page, ensure that All domains in the planet is selected, then skip the remainder of Step 1, and continue to Step 2 below.
AWS Cloudfront users will see the controls described below. For non-AWS CDNs, at the top left of the page, ensure that Specific domains is selected to display them.
Select CDN: If there are multiple AWS load balancers, this control will appear. Select the AWS CDN provider for each domain/path where the cache has to be purged. In other situations (e.g., the planet uses the Google Cloud or Link11 CDN, or has only one AWS load balancer) this control is unnecessary and will not appear.
Alternative domain names: For non-AWS CDNs, specify a domain configured within the planet. AWS Cloudfront does not support individual purges, so Cloudfront users will see a non-editable list (for informational purposes only) of all the domains for which caches will be purged.
Add a specific path:
Adding more domains/paths Multiple domains and/or paths can be specified for a purge.
After appropriate values have been entered into the controls described above, if another domain or path purge needs to be defined, select the New Host button and populate the new entry in the purge list. Repeat this process until all desired purges have been specified.
Select the Purge CDN cache button. The specified purge(s) will appear in the Results list at the bottom of the page.
The Results list shows a history of purge commands submitted during the previous week. The list shows the date and time when each was submitted.
Within the list, the Status field shows the result of each purge during the most recent status update. Updates occur when the page is loaded or reloaded, and also each time the Refresh Status button is selected.
The possible statuses are:
In progress: as of the most recent status update, the purge was still being processed. (Note that depending on how recently the list was updated, the actual current status might be different.)
Done. The purge completed successfully.
Failed. The purge was attempted but was not successful. To try again, a new purge command must be submitted.
Not available. The purge was unsuccessful because the CDN was unavailable. To try again, a new purge command must be submitted.
This page allows admins to manage users of the Link11 WAAP system.
User administration follows the List/Editor UI conventions described .
Select the + New button, and the New User dialog will appear:
Note that once a user is created, the email and organization values cannot be edited later. To change these, the user should be deleted and
Log Exporters allow admins to stream event data to an outside destination, e.g. a SIEM solution. Every few seconds, Link11 WAAP bundles and exports the most recent traffic events from its internal logs.
If desired, data values can be truncated according to settings in the System DB.
There is a known issue when attempting to create a new Log Exporter.
Below is a discussion of the console interface for configuring Log Exporters.
Log Exporters operate at the system level. Admins can configure them for specific , or for the entire planet.
The main Log Exporter window lists all currently defined Log Exporters.
The administration (addition/deletion/editing/versioning) of Log Exporters follows the conventions described .
A unique name for use within L11WAAP.
Whether or not this Log Exporter is currently active.
The destination IP to which event data will be sent.
The port to which event data will be sent.
The specific server groups for which event data will be sent.
When this is enabled, exported data will include a Base64-encoded representation of the HTTP request: its headers, cookies, and query arguments. This enables customer admins to extract and inspect the auth token and other metadata required for customer identification and security analysis.
Request data will be truncated (if necessary) to the , then encoded for export.
The protocol to use while streaming the event data.
TCP: Event data will be streamed over TCP.
TCP + TLS (Trusted): Event data will be streamed over HTTPS. When this is selected, an additional control will appear for uploading a PEM file containing the TLS certificate for the data's destination. The system will validate the certificate upon upload.
TCP + TLS (Untrusted): Event data will be streamed over HTTPS, but the system will not use a certificate.
Blocked: Export only the requests blocked by L11WAAP.
All: Export all the requests blocked or passed by L11WAAP.
If a Log Exporter has been configured but is not streaming data:
Verify that it is in .
If its is TCP + TLS (Trusted), verify that the certificate is valid and has not expired.
If a Log Exporter is streaming truncated data, verify the data-length limits set in the .
Sometimes situations will arise where an attacker needs to be blocked temporarily, while the security posture is being reconfigured. Since the hostile traffic is not being filtered, admins recognize that their security posture needs to be strengthened, but they need some time to analyze the situation. Meanwhile, the attacker should be blocked.
It might seem that admins should merely add the system tag for the attacker's IP (e.g., ip:82-64-131-193) to the Enforce Deny column in the applicable ACL Profile. This can work (as long as the attacker is consistently using the same IP), but it's not necessarily the best approach.
The better approach is usually to create a , based upon criteria that will match the attacker (but will not match any other traffic source), with an to block the matching requests.
Here's why this is usually the optimal choice:
While both approaches can be done when the attacker is using a single IP (or a set of IPs), the second one also supports situations where the attacker is rotating IPs, and therefore needs to be identified with a combination of characteristics.
The ACL Profile will limit the blocking to specific paths/URLs (those defined in the associated with it, and used within one or more ). The Global Filter will block the attacker's activity globally, which is usually more desirable.
The Global Filter is more efficient during processing, because the hostile requests are blocked earlier in the .
Instead of creating and discarding one-off Global Filters, it's often better to maintain a dedicated Global Filter for manually blocking attackers. As traffic sources need to be blocked (or unblocked), admins can just add (or remove) matching criteria.
This creates a single location for administering these special cases. Admins can easily monitor the current list of manual interventions, and purge them as they become obsolete.
The {config} API parameter is discussed here.
Load balancer administration is discussed here. The discussion below assumes familiarity with it.
As explained , when a Link11 load balancer supports a multi-regional planet, admins can (if desired) configure traffic routing.
The API provides additional granularity beyond the configuration available in the web console:
In the UI, the load balancer is treated as a single instance. However, this "one" load balancer is conceptual: it represents multiple physical instances, running simultaneously in different cities. The API provides the ability to configure each city separately, if desired.
In the UI, the Preferred datacenter control displays a list of datacenters where Link11 WAAP has been deployed. In the API, this list is provided in the upstream_regions parameter, which is returned when calling GET /api/v4.3/conf/{config}/load-balancers/regions.
In the UI, one Preferred datacenter can be selected, which will be applied to all cities. In the API, different datacenters can be specified for different cities, by calling POST /api/v4.3/conf/{config}/load-balancers/regions.
To retrieve information about all load balancers:
GET /api/v4.3/conf/{config}/load-balancers
To add a certificate:
PUT /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates/{certificate_id}
To remove a certificate:
DELETE /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates
To get the list of Link11 WAAP datacenters, and each city's current preference:
GET /api/v4.3/conf/{config}/load-balancers/regions
To set preferred datacenters for each city:
POST /api/v4.3/conf/{config}/load-balancers/regions
This page within the L11WAAP console displays the current System Database. The parameters contained here are used throughout the system.
Most of these settings are displayed for informational purposes only. In some cases, they can reflect features of the system not currently in use.
The following features are available for configuration by customer admins:
Used in this Product Manual
The ACL Profile approach can result in the long-term accumulation of "special cases" within the Profiles, if admins are not diligent about cleaning them up when they're no longer needed. This situation is not ideal, because it can be messy and difficult to manage. The Global Filter approach makes it easier to also consists in creating special cases, but they are more visible and thus, easier to find and purge when no longer necessary.
Traffic routing: If the request successfully passes through the filtering process, the system must decide how and where to route it to the protected backend.
As shown in the diagram above, a fundamental component within L11WAAP is the Server Group. Generally, admins will configure a Server Group to represent a domain. Each Server Group specifies:
A Security Policy, used for policy mapping.
The Proxy Template that is based upon.
The domain's SSL Certificate.
During the traffic filtering process, some stages of processing (for example, Global Filtering) are universal; the same rulesets are enforced upon all requests.
However, other stages of processing will vary. Admins can specify different rulesets for enforcement, depending on the request's destination URL. For these stages, policy mapping is necessary.
When a request is received, it is first matched with the appropriate Server Group. As shown above, every Server Group includes a Security Policy, which is the foundation for policy mapping.
Each Security Policy includes a list of paths (which are usually expressions, although individual URLs can be specified too). It associates each path with several rulesets:
Content Filter Profile (which defines the threat signatures, content requirements, and other restrictions to enforce upon the request according to its content)
Rate Limit Rule(s) (which restrict the rates at which traffic sources can submit requests)
ACL Profile (which define the disposition of requests, depending on the tags that it received during processing)
The request's destination URL is evaluated against the list of paths, to find the best match. The rulesets associated with that path are the ones used to process the request. For more information, see the explanation of Security Policy path mapping.
When a request has successfully passed through traffic filtering, L11WAAP forwards it to the customer's backend, accepts the backend's response, and returns the response to the client.
To do this, the system must know how to route requests to the backend. This is configured in Security Policies.
Each Security Policy includes a list of paths (which are usually expressions, although individual URLs can be specified too). Each path is associated with, among other things, a Backend Service.
When a request is processed, its destination URL is evaluated against the list of paths, to find the best match. The Backend Service associated with that path is the one to which L11WAAP will send the request, and then receive the response, and so on.












When this control is untoggled, caches for the entire domain will be purged.
When this control is toggled, the Path field will appear. Enter the path for which the cache should be purged.

Contact Name
The user's name
The user's email address. Note: after a user is created, this value is read-only and cannot be edited.
Mobile
The user's mobile number, for sending OTP (one-time passwords) via SMS. This is an optional entry, because L11WAAP also provides other options for multi-factor authentication (which are configured on the Account page). The number should begin with a "+" symbol and the country code. Example: a US number should appear in the format +12223334567.
Access Level
There are four Access Levels within L11WAAP:
Viewer: can see the Analytics section, i.e. the Dashboard and Events Log.
Editor: has all Viewer permissions, and can also configure security rulesets and policies.
Organization Admin: has all Editor permissions, and can also manage users.
Reblaze Admin: has all Organization Admin permissions, and can also manage the organization. Note that this Access Level is not available through User Management; these Admins must be added manually.
Organization
The organizations within the planet. The list of organizations is obtained during system bootup.




Blocklist
BQ
BigQuery
BQML
BigQuery Machine Learning
CA
Cloud Armor
CDN
Content Delivery Network
FP
False Positive
GCP
Google Cloud Platform
IPS
Intrusion Prevention System
LB
Load Balancer
ML
Machine Learning
RFC
Request for Comments
SIEM
Security Information and Events Management
SOC
Security Operation Center
TTL
Time to Live
VPC
Virtual Private Cloud
WAAP
Web Application and API Protection
WAF
Web Application Firewall
Acronym
Meaning
ACL
Access Control List
API
Application Programming Interface
ASN
Autonomous System Number
AWS
Amazon Web Services
BL
By default, the Link11 WAAP interface does not offer management of certificates for mTLS. These features can be enabled through the System DB.
To do this, begin by selecting the system namespace for editing, then select feature-toggle.
As shown above, this contains three parameters:
ssl-client-to-v5-client-ca-certificate, for mTLS between Link11 WAAP and end users.
ssl-server-to-backend-mtls-certificate, for mTLS between Link11 WAAP and the customer origin (a certificate for customer origins to validate L11WAAP).
ssl-server-to-backend-ca-certificate, for mTLS between Link11 WAAP and the customer origin (a certificate for L11WAAP to validate customer origins).
Set the appropriate parameter(s) to true, save the changes, and then publish.
If ssl-client-to-v5-client-ca-certificatewas activated, the CA Certificates tab will appear on the Certificates page. After being added there, certificates will be available for use in Server Groups.
If ssl-server-to-backend-mtls-certificatewas activated, the Server-to-Backend mTLS Certificates tab will appear on the Certificates page. After being added there, certificates will be available for use in Backend Services.
If ssl-server-to-backend-ca-certificate was activated, the Server-to-Backend CA Certificates tab will appear on the page. After being added there, certificates will be available for use in .
The following can be helpful in understanding the names and usage of the various certificates:
Log Exporters stream traffic data to external destinations. Using the System DB, admins can limit the maximum lengths of various data included in the messages.
This is done by selecting the system namespace for editing, then selecting log-exporter. The values shown above will be available for editing.
After editing any of these parameters, save the changes and then publish.
The max_characters settings are the allowable lengths for the various data fields.
Each setting is specified as the maximum number of characters. Data exceeding those lengths will be truncated.
The encoded_fields limit applies to all fields within encoded requests, i.e. to each header, cookie, and argument.
The request_data_max_parameters_num limit defines the maximum number of parameters in the encoded data. For example, when this is set to 100, then the following limits are enforced:
The maximum number of POST data parameters is 100
The maximum number of GET data parameters is 100
The maximum number of header data parameters is 100

Link11 WAAP subjects incoming requests to a multi-stage filtering process.
Below is a high-level description of the overall process. For a more in-depth review of the various stages and how to configure them, see their detailed discussion in the Console UI Walkthrough section of this manual, as linked to below in each description.
When processing an incoming request, L11WAAP enforces the applicable security rulesets. As shown above, some types of rulesets are applicable to all requests, while others will vary depending on each request's destination URL and/or the tags attached to the request. To see how L11WAAP decides which rulesets are applicable to a request, see the Policy Mapping page.
Link11 WAAP acts as a proxy for the backend that it protects. It receives incoming requests, and examines them for potential threats. Requests that pass inspection are passed through to the backend. Those that do not pass inspection trigger an , which often is either a blocking action or a . Along the way, L11WAAP logs the request and the actions that occur, which are available to admins via analytics and dashboards.
The diagram above shows the progression of incoming requests through this process, shown from left to right. When a request successfully passes a stage, it proceeds to the next stage, as designated by a green arrow. When it does not, it follows the red arrow instead. Black arrows show activities that occur independent of a request's evaluation.
Before any other processing occurs, L11WAAP can execute one or more . An Edge Function consists of custom Lua code; it allows admins to extend the system's capabilities as desired.
Each Edge Function contains a parameter. When this is set to Request Pre Processing, the Function is executed immediately, before other processing occurs.
L11WAAP uses a when processing and evaluating requests. At various points during processing, tags are attached to a request based on its source, content, and other characteristics.
Subsequently, the attached tags can be the basis for decisions about the disposition of the request.
In this stage of processing, each request receives a . For example, every request will be tagged with all, along with tags for the geolocation of the traffic source.
This stage is also when L11WAAP performs : determining which security rulesets should be enforced upon the request.
The stage has two primary purposes:
Attaching tags when the request matches specified criteria.
Executing an depending on the tags that were attached. In some situations, admins will decide to stop ths system's processing at the Global Filter stage. For example, an admin can decide that if the traffic source is found on a hostile IP list, there is no point in analyzing it further; it should just be blocked.
In this stage, are evaluated. Flow Control allows admins to define and enforce sequences (flows) of requests submitted by traffic sources.
Example: a web application has a login page. A legitimate user will submit a GET request to access the page, followed by a POST request with login credentials. Conversely, a threat actor waging a brute-force attack might conserve resources by submitting a series of POSTS, without any GETs. A Flow Control Policy can allow the legitimate user to access the page, while excluding the threat actor.
Rate limiting restricts the rate at which the system will accept requests from traffic sources. When a limit is exceeded, an action can be taken.
In this stage, rate limiting is enforced upon incoming requests, regardless of their destination URLs. The limits are defined in with enabled.
In this stage, path-specific rate limiting is enforced. Admins can define different parameters for the limits, depending on the request's destination URL.
Path-specific rate limiting can be configured in two places within the system:
that do not have enabled.
, which allow for IP-based rate limiting to be defined for all applications based upon them.
An defines what will happen to a request, based on the tags that it contains. Admins can assign a variety of available actions that will be performed.
As shown in the diagram above, three outcomes are possible:
The request triggers an .
The request is passed, and then subjected to content filtering.
The request is passed, but is exempted from content filtering.
In this stage, the applicable is used to evaluate the request. Each Profile defines the applicability of various .
This stage fulfills the traditional role of a WAF, which is to examine the content of a request for threat signatures and take action when a match is found.
However, Content Filtering within L11WAAP is much more powerful than this. Admins can configure Content Filter Profiles to allow or block requests if they do have specific characteristics, or if they don't.
When an has a setting of Request Post Processing, L11WAAP will execute it as the final step in its processing, before sending the request to the backend.
When a request has passed all of the system's processing, it is forwarded to the backend. The backend's response is then obtained, and returned to the client. L11WAAP's interaction with the backend is configured in and .
Various stages of processing can result in an being executed. Often, this is a blocking action, but as well, including the acceptance of the request and bypassing the remainder of the filtering process.
L11WAAP stores all requests and their details, and makes them accessible in the .
The and provide customizable displays of traffic and events.
L11WAAP periodically reviews the most recent tranche of incoming requests and evaluates them using . Unlike the other stages of analysis described above, this is done after the requests have been processed, and the resulting responses have been returned to the user.
Dynamic Rules are not meant to pass or block specific requests. Instead, they are used to analyze the overall behavior of traffic sources, as shown in the requests they have recently submitted.
When a traffic source violates a Dynamic Rule, the traffic source is quarantined. Until the quarantine expires, two things occur:
The traffic source is added to the list, where admins can monitor it.
The traffic source can also be banned, which means that future requests will be blocked. (As shown in the diagram above, this is done by adding the traffic source to an internal system-maintained Global Filter, automatically.)
Tagging valid or invalid session flow patterns
Flow Control Policies allow admins to define "flow" sequences of submitted requests. As incoming traffic is received, the requests are evaluated against the active Policies. If a defined sequence is completed--in other words, if the listed requests are received in the specified order--the Policy will attach one or more tags to the final request in the sequence. The tags can subsequently trigger an action (allow, block, challenge, etc.)
Link11 WAAP includes several types of behavioral profiling and control. Flow Control Policies are one type of behavioral control that are defined by admins. They can allow, or disallow, traffic sources that display specific patterns of behavior.
Use case example: A web application has a login page. A legitimate user session will begin with a GET request, followed by a POST. However, threat actors who are waging brute-force login attacks will typically just send a series of POSTs. A Flow Control Policy can be the basis for blocking every POST request that was not preceded by a GET.
A Flow Control Policy's purpose is to assign its defined Tags to the last request in defined flow sequences. The Tags can then be used in or to trigger specific actions. Usually, a is involved in the process as well (see the implementation example below).
Unlike some other types of security settings, Flow Control Policies are not assigned to paths in , because a Flow Control Policy can incorporate multiple paths within an application or API.
Instead, each Policy has its applicable scope defined by the Active, Include, and Exclude parameters, as described below.
To implement the GET/POST example mentioned above, an admin would create the following configuration:
A Global Filter would assign a tag (e.g., method-post) to all POST requests sent to /login.
A Flow Control Policy would assign a tag (e.g., login-flow) to each POST that was preceded by a GET.
The main page (shown above) lists all current Flow Control Policies.
The administration (addition/deletion/editing/versioning) of Policies follows the conventions described .
Each Flow Control Policy consists of:
A flow sequence: A list of two or requests that are expected to be received in the sequence shown, within the specified Time frame.
Tag(s) to assign to the final request in the defined flow sequence.
Include/Exclude: Tags to define the scope within which this Policy is enforced.
Each of these is described in depth below.
A name for this Policy, to be used within the interface. A (shown below the Tags field) will include it as well.
When this toggle is selected, the Policy will be enforced within its defined scope.
This defines the time available for the flow sequence to be completed. When the first request in the sequence is received, an internal timer begins. The final request must be received within the Time Frame in order for the Tags to be assigned.
At any given time, an application might receive a variety of incoming requests from different users simultaneously, each of which might be at a different stage of a flow sequence. For Flow Control Policies to work successfully, the system must be able to differentiate among all the various streams of incoming traffic, and perform stateful evaluations of each one separately.
The Count by parameter allows admins to define how this differentiation is done. For example, a common configuration is Attribute / IP Address. When the application is receiving requests from multiple IP addresses simultaneously, the requests from each IP will be considered as a separate and distinct set for Flow Control purposes. On the other hand, if it is possible that users will sometimes share IP addresses, then a better choice might be Attribute / Session ID.
Admins have a variety of configuration options for this parameter. Incoming requests can be processed according to specific headers, cookies, arguments, or attributes.
Multifactorial Count by definitions can be set up by selecting "New entry" and editing the controls that appear. When incoming requests are evaluated, the Count by definitions are combined with a logical AND.
Enter one or more unique tags, separated by spaces. When a series of incoming requests matches the flow control sequence, the tags listed here will be attached to the final request.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.
Information about this Policy, for use within the interface.
These are lists of tags that can limit the applicable scope for this Policy. Their use is described on the page.
This is an admin-defined sequence of at least two steps.
The system maintains stateful histories of each traffic stream defined by the Count by parameter. When a series of incoming requests matches the Flow Control Sequence exactly, the final request has the defined Tags attached.
Each step in the sequence is defined by a Method, Host, and Path, along with any optional parameters added by an admin.
A new Flow Control Policy includes a two-step sequence by default. To add additional steps, select the "Add Step" button.
Signatures of threats and other potential issues
A traditional WAF evaluates incoming requests according to a list of threat signatures, and flags the request if any matches are found.
Within Link11 WAAP, Content Filter Rules provide the equivalent of these signatures, although they are more powerful and flexible than those within a traditional WAF.
When a request undergoes the content filtering process, its content is compared to the Rules administered here. When a request matches a Rule, various tags will be attached to it. Those tags can be evaluated, and can cause actions to be taken on the request.
Content Filter Rules are defined globally within the system, and are available to all Content Filter Profiles.
The usage of Content Filter Profiles within applications and APIs is explained .
The main page lists all current Content Filter Rules.
The administration (addition/deletion/editing/versioning) of Rules follows the conventions described .
A Content Filter Rule consists of the following:
The signature for this Rule. Usually, this represents the characteristics that makes a request hostile. (Match)
Organizational parameters for the Rule (Category, Subcategory, Risk level)
Tags to apply to requests that match this Rule
A name for this Rule, to be used within the interface. A (shown below the Tags field) will include it as well.
For the default Rules included with L11WAAP, the Names are numeric identifiers. (A production deployment will include a large number of Rules; therefore, they are usually organized/administered by their categories and subcategories.)
Information about this Rule, for use within the interface.
A general category for this Rule. It will be the basis for a system tag.
A subcategory for this Rule, within the general Category. It will be the basis for a system tag.
A number ranging from 1 (lowest threat) to 5 (highest threat). It will be the basis for a system tag.
A list of one or more tags, separated by spaces. Whenever this Content Filter Rule's Match condition matches a request, these tags will be attached.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.
The tags are the basis for the decisions made when the applicable is evaluated for a request. They will also appear in the traffic logs.
(This field is not currently used, but will be in a pending release.) A message that will appear in the traffic logs when a request matches the Match condition.
The criteria against which incoming requests will be compared. For Content Filter rules only, regexps are of the hyperscan flavor ().
As described here, out of the box Link11 WAAP includes an Active Challenge process. This is very useful in distinguishing humans from bots.
Active Challenges work well, but an even better option is Passive Challenges.
Active Challenges temporarily redirect the user's browser. This can affect site metrics gathered by products such as Google Analytics. (Specifically, the initial referrer information is lost.) Passive Challenges are simple pieces of Javascript. They do not redirect the user's browser; they merely ask it to solve a challenge, and then insert the L11WAAP cookies.
Active Challenges will not occur when site content is served from a CDN. Passive Challenges can still detect bots in this situation.
Most importantly, Passive Challenges allow L11WAAP to use Biometric Bot Detection—an advanced and sophisticated means of distinguishing humans from automated traffic sources.
With Biometric Bot Detection, L11WAAP continually gathers and analyzes stats such as client-side I/O events, triggered by the user’s keyboard, mouse, scroll, touch, zoom, device orientation, movements, and more. Based on these metrics, the platform constructs and maintains behavioral profiles of legitimate human visitors. L11WAAP learns and understands how actual humans interact with the web apps it is protecting. Continuous multivariate analysis verifies that each user is indeed conforming to expected behavioral patterns, and is thus a human user with legitimate intentions.
Implementing Passive Challenges is simple. Place this Javascript code within the pages of your web applications:
If desired, the script code can include async and/or defer attributes:
These usually are not necessary, and their effect will depend on the placement of the script within the page. Their use is left to your discretion.
To test the implementation, use a browser to visit a page containing the Javascript snippet. Once it runs, the browser should have a cookie named waap_id.
There are two primary situations where customers sometimes want to disable Active Challenges:
When a customer needs site analytics to correctly reflect all referrers. (Active Challenges can interfere with this.)
For API endpoints. Active Challenges are designed to verify the client's browser environment; for most API calls, there is no browser environment to verify. (For users of our , this is not a problem. They can still use active challenges for these endpoints.)
Other than those situations, Active Challenges can be very beneficial.
If you wish to turn off Active Challenges, do the following.
Decide which paths/URLs should have Active Challenges disabled.
Make a list of the that are enforced upon those paths/URLs.
Ensure that this combined list of Security Policies does not apply to any paths/URLs where you wish to keep Active Challenges enabled. If there are some undesired paths/URLs included, split them off into separate Security Policies that are not part of the list. When you are done, the list of Policies should include all desired paths/URLs, and only those paths/URLs.
If you have not enabled Passive Challenges (and successfully tested them), disabling Active Challenges is not recommended.
Link11 WAAP supports mTLS encryption. This is optional, and can be enabled separately for:
Communication between Link11 WAAP and customer backends, for one or both ends of the pipeline.
Communication between clients (end users) and L11WAAP.
To enable mTLS for an end of a pipeline, the appropriate certificate must be supplied. Their names within the system are as follows:
Configuring mTLS to the customer backend is straightforward. After enabling this feature (as described below), admins add certificate(s) and assign them to . Once configured, L11WAAP will use mTLS when communicating with customer origins.
Configuring mTLS to clients also requires feature enablement. Then, admins add CA Certificates and assign them to .
Once client-to-L11WAAP mTLS is configured, end users will be required to present a client certificate at the beginning of each session during the TLS handshake. L11WAAP will validate the certificate, including the date, issuer, and verification against the . If validation fails, the user will receive an error, and will not be permitted to connect to the protected system.
Two additional notes about this type of mTLS:
In the user interface, mTLS is only available when using an AWS (Network Load Balancer). To enable mTLS when using a Link11 load balancer, contact support.
mTLS verification does not exempt a client from other types of traffic filtering. Even if a client successfully establishes an mTLS connection with L11WAAP, its requests will still be blocked if they originate from a banned source, or exceed rate limits, or match a content filtering signature, etc.
Follow this process:
.
Upload the certificate(s) in the Server-to-Backend mTLS Certificates tab and/or Server-to-Backend CA Certificates tab(s) of the page.
your changes.
Assign the appropriate certificate(s) to each Backend Service:
Follow this process:
.
Upload the CA Certificate(s) in the CA Certificates tab of the page.
your changes.
Assign the appropriate certificate to each Server Group:
While Swagger UI provides a visual interface into the API, it is often desirable to send API calls via the command line. For this, curl can be used.
To send a curl request to the API, two things are required:
An API key
The curl command string
If an API key is not already available from previous API usage, the following steps should be followed.
Log into the planet console using a Link11 WAAP account (i.e., without using SSO). The account must have an of Editor or higher.
Navigate to by selecting the user icon on the top right of the page
Navigate to Account Details -> API Keys. (If Account Details is not displayed in the Account menu, verify that the login was done directly into the planet using an L11WAAP account. If SSO is used, Account Details will not be available in the interface.)
Sending an API request via Swagger UI will also construct and display its curl command string:
Navigate to .
Expand the desired namespace, and then the desired route within the namespace.
Select the "Try it Now" button
Edit the input fields (if any), providing all required inputs
To send this request using curl, edit the command string to include an additional header (Authorization:Basic) for the API key obtained earlier.
When Swagger UI is used to get a list of configurations via GET /api/v4/conf/configs, it will also display this curl command:
To submit this command directly via curl, the following header must be added:
...without the <>, and where api-key-obtained-earlier is the string obtained .
API calls using curl are constructed according to these requirements:
The API key is included, as explained above
Input parameters defined as query are encoded into the URL
Input parameters defined as header are included as headers
Input parameters defined as Request body are included via curl's -d
A route to retrieve traffic data has this definition:
Note that limit, offset, filters, and debug are marked as query parameters, and therefore, will be encoded into the URL. However, syntax and provider are marked as header parameters.
The resulting curl command will look like this:
The POST /api/v4.0/data/timeline/parse call includes this input:
Let's say that an admin wants to submit the string timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00, status=301. The curl command would look like this:
Administration of SSL certificates
This section allows admins to manage SSL Certificates. There are four kinds of certificates, each with its own tab:
Server Certificates, so that clients (end users) can communicate with Link11 WAAP using HTTPS.
CA Certificates, so that Link11 WAAP can validate clients for mTLS communication.
Server-to-Backend mTLS Certificates, so that customer origins can validate Link11 WAAP for mTLS communication.
Server-to-Backend CA Certificates, so that Link11 WAAP can validate customer origins for mTLS communication.
Server Certificates are necessary for end users to communicate securely with Link11 WAAP. The other types of certificates are optional, and are only necessary for using mTLS (mutual TLS).
Here is a diagram of the different types of certificates:
Out of the box, Link11 offers management of Server Certificates.
To enable management of the other types of certificates so that their tabs appear in the interface, follow the instructions here: .
Server Certificates can be attached to , or to domains via .
Similarly, CA Certificates are also used in Server Groups. However, they are only available in the interface when using AWS NLB (Network Load Balancing). When using a Link11 load balancer, please contact support.
Server-to-Backend mTLS/CA Certificates are used in .
The list of currently defined Certificates is displayed in each tab. From here, new certificates can be generated, or existing ones can be edited.
All four types of certificates are administered using the same procedures, described below.
By default, Link11 WAAP offers admins the ability to auto-replace certificates using Let's Encrypt, and to download certificates in PFX format. To remove these features from the web console and API, .
Selecting the + New button displays the Upload Certificate dialog:
Certificates can be added manually, or L11WAAP can parse a PFX file.
When an existing Certificate is edited, the Edit Certificate dialog appears:
Let's Encrypt is a free certificate authority service. L11WAAP integrates with it, and offers this service by default.
Once a day, L11WAAP will check each application it protects. If that application's certificate is going to expire in the coming week, and its Auto Replacement by Let's Encrypt option for that certificate is enabled, L11WAAP will generate a new certificate using Let's Encrypt, and will attach all of its sites to the new certificate.
This tab includes a list of Server Groups. Selecting one will connect this Certificate to it.
This tab includes a list of Certificates defined within the system. Selecting one and then clicking Save will result in all sites/applications being transferred from the selected Certificate over to the Certificate you're currently editing.
This will download the certificate information as a file in PFX format.
Running custom code during traffic processing
An Edge Function (EF) allow you to extend Link11 WAAP's tools and functionality. An EF consists of Lua code that can be run at different points in L11WAAP's traffic processing.
An EF can be configured to execute before any other processing occurs. Therefore, it can override or preempt other configured settings within L11WAAP.
Or, it can be run after traffic filtering has been completed. An example use case is .
This section explains the usage of L11WAAP's API.
Open the Backend Service in the Backend Service Editor page.
Select the appropriate certificate(s) in the dropdown list(s).
Save and publish your changes.
Open the Server Group in the Server Group Editor page.
Select the appropriate CA certificate in the dropdown list.
Select the desired mode.
Configure CRLs (Client Revocation Lists), if desired
Save and publish your changes.





An ACL Profile would Block/Skip all requests tagged with login-flow, and Block/Apply all requests tagged with method-post.
General parameters for administrative purposes.


General parameters for administration (Name, Description)


To create a new private key, use one of the following OpenSSL commands.
Create an RSA-2048 private key:
Create an ECDSA P-256 private key:
...where $PRIVATE_KEY_FILE is the path and filename for the new private key file.




To completely disable Active Challenges, ensure that its ACL Profile does not include any tags in the Bot Challenge / Apply column.
To partially disable Active Challenges, ensure that its ACL Profile has the proper combination of tags in the Bot Challenge / Skip and Bot Challenge / Apply columns.
Copy the value of that key for use within curl. (Note: this is the string that the system generated, not the name you supplied.)
Select the "Execute" button
After sending the request, Swagger UI will display the curl command string. Copy this.


openssl genrsa -out $PRIVATE_KEY_FILE 2048openssl ecparam -name prime256v1 -genkey -noout -out $PRIVATE_KEY_FILE<script src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script><script async src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script><script defer src="/c3650cdf-216a-4ba2-80b0-9d6c540b105e58d2670b-ea0f-484e-b88c-0e2c1499ec9bd71e4b42-8570-44e3-89b6-845326fa43b6" type="text/javascript"></script>curl -X 'GET' \
'https://www.mysite.com/api/v4/conf/configs' \
-H 'accept: application/json'-H 'Authorization:Basic <api-key-obtained-earlier>'curl -X 'GET' \
'https://mysite.com/api/v4.0/data/logs?limit=100&offset=0&filters=%7B%22AND%22%3A%5B%7B%22field%22%3A%20%22timestamp%22%2C%20%22value%22%3A%20%5B%222024-06-02T00%3A00%3A00%22%2C%20%222024-06-03T00%3A00%3A00%22%5D%2C%22op%22%3A%20%22between%22%7D%20%5D%7D&debug=false' \
-H 'accept: application/json' \
-H 'syntax: json' \
-H 'provider: bigquery' \
-H 'Authorization:Basic kFiudeEIOSd18dDineS2wn98sIO'curl -X 'POST' \
'https://mysite.com/api/v4.0/data/timeline/parse' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization:Basic kFiudeEIOSd18dDineS2wn98sIO' \
-d '{
"query": "timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00, status=301"
}'AI traffic management: AI crawlers can be blocked or otherwise managed as needed; configuration can be set up per-crawler and at various scopes (from globally down to individual URLs). Visitors referred by these services (e.g., chatgpt.com) can also be handled uniquely if desired.
Dynamic management of Trusted Sources: Each Proxy Template includes a list of trusted sources: IP ranges from which Link11 WAAP will accept traffic (for example, load balancers or a CDN). Previously, the list of trusted IP ranges had to be managed manually. Now, Global Filters can also be added as Trusted Sources; when a Filter is updated, the linked Proxy Template will be updated dynamically as well.
Custom traffic log annotations: Edge Functions can now be used to inject custom messages into events for better visibility, monitoring, debugging, etc.
Excessive request sizes: Resolved an issue where excessively-large requests were blocked, but the reason was not logged.
Log exceptions: Resolved an issue where a name-resolution exception would produce excessive error messages.
Control over Log Exporter data: To better manage syslog messages, admins can now define maximum-length limits for various Log Exporter fields. Exported data values will be truncated to those limits.
Tag visibility via Edge Functions: Post-processing Edge Functions can now access information about the tags attached to the request.
Malformed body inspection: Resolved an issue where requests with malformed bodies were not being fully inspected. As part of this bug fix, all Content Filter Profiles had the malformed-body tag added to their Ignore sections. To enable content filtering on malformed bodies, this tag can be removed; however, note that this can potentially result in performance degradation and False Positive alarms.
mTLS cancellation: Resolved an issue where mTLS, when previously enabled but subsequently disabled, was still being enforced.
CRLs (Client Revocation Lists) for mTLS: When mTLS has been enabled for communication with clients, admins can use CRLs to verify client certificates. Unauthorized or compromised clients will be rejected without waiting for certificate expiration.
Enhanced traffic data exporting: Log Exporters now include an option to include a Base64-encoded representation of the HTTP request (its headers, cookies, and query arguments). Customers can now extract and inspect the auth token and other metadata required for customer identification and security analysis.
Modal display of entities in Tag Finder: In the Tag Finder, the user can view a list of security entities that use or can generate a specific tag, and can open each one. Previously, entities were opened in their appropriate editors; now, to preserve session context, each one opens in a read-only window.
Security Policy path map search capability: When editing a Security Policy, the Path Mapping table now has Filter fields at the top of each column for quickly finding specific entries. Regex is supported.
Multi-regional independent load balancing: For planets spanning multiple regions, individual load balancers can now be defined, each with distinct settings. Each load balancer can have a list of preferred datacenters to which it will send its traffic for processing, so that admins can ensure optimal routing within geographic regions.
Dashboard Top Metrics query building: Resolved an issue that could occur when examining a Top Metric, where the Events Log (matching) option would open the Events Log, but without pre-populating the query.
Let's Encrypt certificate generation: Resolved an issue where using the Redirect HTTP to HTTPS Edge Function could prevent the generation of Let's Encrypt certificates.
Validation of customer backends for mutual TLS: Previously, admins could configure mTLS so that Link11 WAAP would validate end users, and customer backends would validate L11WAAP. This release adds support for validation of customer origins by L11WAAP.
Additional certificate visibility: The Certificates page now includes a consolidated column for cloud providers and a new column showing whether the certificate was issued by Let's Encrypt.
Passive challenge cookies: As part of the recent Link11 rebranding, passive challenge cookies have been renamed. (Previously, they were rbzid ; now, they are named waap_id.) Admins should ensure that if any security rulesets (such as Rate Limit Rules, Dynamic Rules, etc.) were based on these cookies, that these rulesets are updated.
User interface: Resolved some minor issues in the UI.
Edge Function redirects: Resolved an issue where requests redirected during the Request Pre Processing phase were not being logged.
SSL certificate renewal: Resolved an issue where customers using Link11 load balancing could have difficulties when auto-renewing certificates.
Adding a Backend Service: Resolved an issue where an existing Backend Service configuration couldn't be duplicated.
Extended mTLS support: Mutual TLS is now supported between L11 WAAP and customer backends.
Easier use of Edge Functions: Edge Functions can now be connected to Security Polices from within the Edge Functions Editor.
Enhanced HTML pages for Block actions. Previously, blocking Actions included a minimalistic default response. Actions that still contain this default (a Content value of access denied) will be upgraded to a rich HTML page, based on the customization tokens introduced in release v5.3.15. Admins can also create their own customized response pages.
Content Filtering triggers: Resolved an issue that could occur when a Content Filter Rule blocked a request, but in the logs, the trigger for the block would be misidentified.
Dashboard chart rendering: Resolved an issue where charts would not correctly respond when the user zoomed in or out.
Events blocked by origin: Resolved an issue where requests blocked by the backend could be shown in the Dashboard as "passed".
Log Exporter behavior: Resolved an issue where Log Exporters that aren't correctly configured would generate excessive amounts of traffic data.
Truncated event data: Resolved an issue where excessively large requests (those exceeding the maximum allowable log entry size) were not being correctly truncated in the Events Log.
Enhanced granularity for Dashboard queries: When querying traffic data for the Dashboard, admins can now filter by domain.
Self-generated SSL certificates: Customer systems can now communicate directly with Let's Encrypt to generate or renew their own certificates using the ACME protocol. In previous releases, the resulting challenges from LE would be dropped; now, Link11 WAAP will pass LE responses through to the customer backend.
SSL private key security: Planets can now be configured so that certificates cannot be downloaded or replaced.
Enhanced Events Log display for large quantities of arguments: In the April 17 release, it became possible (using an internal setting) to defer argument retrieval until the admin chose to see them. In the current release, this has been refined further; when a large quantity of arguments is displayed, the UI will present them in a user-friendly table that includes search capabilities.
Enhanced granularity when offloading IP blocking: In Dynamic Rules, when offloading IP blocking to Link11's Layer 3 protection, admins can now use Include/Exclude tags to narrow down the applicable scope of the Rules.
User agent visibility: Resolved an issue in the Events Log where long user-agent strings were being truncated.
Events Log results display: Resolved an issue where the dropdown list offering different quantities of results was sorted incorrectly.
Proxy Template creation: Resolved an issue where a Proxy Template containing an Advanced Configuration could not be duplicated.
Analytics date/time specification: Resolved an issue where the date/time selection control was displaying some options on a transparent background.
Site-level Rate Limit Rules: Resolved an issue where site-level Rules were not backwards-compatible with certain automated updates.
Quarantined IP duplication: Resolved an issue where a misbehaving IP could be added to the Quarantine list more than once.
Log Exporter unavailability: Resolved an issue where a certificate without a CN could make Log Exporter configurations unavailable.
Query parameters display in the Events Log: Resolved an issue where requests could be shown with duplicated parameters.
UI issues: Resolved several minor issues in the web console.
Rebranding: The Link11 WAAP interface has been throughly updated, presenting a new look as part of Link11's rebranding.
Enhanced Events Log filtering: Events Log queries can now be filtered by domain.
Customizable block responses: Admins have additional ways to customize the responses to blocked requests.
Edge Function flexibility: Admins have additional options for timing the execution of Edge Functions.
Duplicate tags in Content Filter Profiles: Resolved an issue where the Content Filter Profiles Editor could display tags twice in the Ignore Content Filter Tags field.
Improved Dashboard performance: The Dashboard is now more responsive when the planet is undergoing a large attack.
Improved Events Log performance: Events Log entry display is now more performant for requests containing large, or a large number of, arguments. Argument retrieval can be deferred until the user selects them for viewing.
Easier applications of Rate Limit Rules: A Rate Limit Rule can now be attached to all Security Polices with a single action in the UI. Admins can then delete individual attachments as desired.
Immediate SSL certificate generation: When a domain is added to a Server Group, and the change is saved, a Let's Encrypt certificate can be generated for it immediately. (Previously, this did not occur until the changes were published.)
Improved visibility of Global Filters, Dynamic Rules, Server Groups, and Proxy Templates: Each of these list pages has a new column, showing more information to reduce clickthroughs to the respective Editor pages. The new columns are:
For Global Filters: whether or not the Filter is system-managed, and the numbers of Sections and Entries in the Filter's Rule list
For Dynamic Rules: the Target field
For Server Groups: the number of hosts
Improved visibility for passed requests: Requests sent to the customer origin now receive additional tags (sent-to-origin and upstream-status:xxx). Use cases include better analysis of potential False Positives, and using Dynamic Rules to exclude requests that reached the origin.
AWS CDN purging: AWS CDN caches can now be purged from within the Link11 WAAP interface.
Additional mTLS options: For communication with clients, admins can now configure a Server Group with these options:
Do not request a CA certificate
Request and require a valid CA certificate
Request but not require a certificate. If the client provides a certificate, it must be valid for communication to continue.
Global Filter editing: Resolved an issue where the Global Filters editor had high latency when a Filter contains a large number of sections.
PEM file import: Resolved an issue preventing the import of PEM files in Windows format (with CRLF end of lines).
Custom backend configuration: Resolved an issue where Proxy Template Custom Configuration Code location-level commands to add headers were not working.
Log Exporter configuration: Resolved an issue preventing Log Exporters from having their ports changed.
Security Policy paths: Resolved an issue preventing multiple Security Policies from containing the same path mapping.
Load Balancing certificates: Resolved an issue where CA certificates were displayed in the list of potential certificates for the LB.
More flexibility when configuring Rate Limits: Admins can now apply a rate limit to an entire site.
Improved CAPTCHAs: Interactive challenges are now more robust. (Some potential methods of bypassing them are no longer possible.)
Dashboard: Resolved an issue where the Topx table would sometimes fail to load.
SSL certificates: Resolved an issue preventing server certificates from being replaced.
SSO session expiration: Resolved an issue where a user logged in via SSO could potentially lose unsaved configuration changes when the SSO token expires. Now, unsaved data is maintained through the expiration/re-login process.
UI: Resolved an issue where the Tag info panel would sometimes fail to open.
End-to-end encryption now supported: Client traffic can now be forwarded to the customer origin while remaining SSL encrypted, e.g. to satisfy PCI 3DS requirements. To enable this feature, contact Support.
Assigning Rate Limit Rules to multiple paths: Admins can now assign a Rate Limit Rule to all defined paths within a site, which creates a separate entry for each path automatically. Individual entries can then be edited or deleted as necessary.
mTLS (mutual TLS) support between clients and L11WAAP: Admins can now upload CA certificates and assign them to Server Groups. Clients attempting to access the specified sites will be required to present certificates, the issuers of which will be validated. This feature was already available when using Link11 load balancers (although it needs to be configured by Support); now it is available for AWS NLB as well, through the user interface and API.
Multiple load balancers now supported: Within the Link11 private cloud, admins can now create multiple load balancer configurations, e.g. various ports can now be opened for a single planet.
Duplicate quarantined IPs: Resolved an issue where during an attack, a hostile IP could be added to the Quarantine list multiple times.
Offloaded IP blocking: Resolved an issue where an IP that was offloaded to Layer 3 protection would not be blocked immediately.
Internal service resilience: Resolved an edge case where if a certain internal service crashed, the system would not try to restart it.
Creating Mobile Application Groups: Resolved an issue where duplicating an existing Mobile Application Group would fail.
UI: Added some minor improvements to the web console.
SDK for mobile applications: The L11WAAP Mobile SDK, previously only available for v2.x, is now available for v5. This is a unique client certification mechanism for iOS and Android apps. In use, the SDK signs the application, authenticates the device, and verifies user identity, adding a cryptographic HMAC signature to each request. The SDK provides a reliable and secure mechanism to confirm that the traffic is originating from a legitimate app user and not a bot or emulator.
Additional protocol for Log Exporters: There is now an "Untrusted" option for Log Exporters' Transport protocol, where TLS will be used, but Link11 will not verify the certificate.
Improved visibility and performance for requests with malformed bodies: When a request has a large malformed body, the entire body is no longer displayed in the Events Log or exported via Log Exporters. Instead, it is truncated to 500 characters, and the displayed/exported event includes a message to this effect.
Dynamic Rules Editor performance: Resolved an issue where the Dynamic Rules Editor page in the UI would take several seconds to load.
Additional resilience for Dynamic Rules: Resolved an edge case when offloaded IPs are quarantined. Previously, if an admin unblocked the IP, and the initial unblocking attempt failed, the unblocking process would not be retried.
Content Filter Profiles tag editing: Resolved an issue where editing a tag list (e.g., the Active allowlist) would remove the tags already on the list.
Improved web console: Resolved some minor issues in, and added some improvements to, the UI.
Improved table search: For various tables in the interface (displaying lists of policies, security rulesets, etc.), it is now easier to find a specific entry:
Search fields are displayed at the top of the list. (Previously, they were hidden unless the Filter button was selected.)
The search fields now support regex. (Example: entering ^Api will filter the list to only show entries starting with Api.)
Easier selection within dropdown lists: Dropdown controls are now easier to use: all options in each list are sorted, and if more than five options are available, the list also contains a Search capability.
Removed certificate limits for load balancers in the Link11 Cloud: When L11WAAP is deployed in the Link11 Cloud, the number of certificates per load balancer is now unlimited.
Improved consistency of Security Policy API: Some legacy field names were updated.
Improved consistency for Autonomous System references: Within the UI and API, some legacy terminology was updated. When mentioning an AS, L11WAAP now consistently refers to it as "organization" rather than "company".
Error-handling of quarantined IPs: Resolved an issue where a request sent from a quarantined IP with a specific syntax error would be blocked, but would not be correctly represented in traffic analytics.
Error-handling when publishing: Resolved an issue where a failed publish operation would not recover gracefully.
Configuring traffic event streaming within the UI: Configuring event streaming to external destinations (e.g., SIEMs) was previously available only through the API. This feature is now available through the web console as well.
Analytics: Resolved an issue where under certain conditions, the Events Log was not displaying the X-Forwarded-Port headers for requests.
Backend SaaS: Improved error handling in the backend services for several edge cases.
UI: Resolved several minor issues.
Additional ability to purge CDN caches: The Purge CDN Cache command now supports Link11's Secure CDN.
Additional options for exporting traffic events: When using Log Exporters to stream event data to an external destination (e.g. a SIEM solution), admins can now choose to export all events, or only events where requests were blocked by L11WAAP. Admins can also choose to export events for all server groups (i.e., sites), or only specific server groups.
Dynamic Rules: Resolved an issue when editing Dynamic Rules that are configured to offload IP blocking to Link11's Layer 3 protection, and that are currently being triggered by one or more IPs. (When such a Rule was deactivated, the triggering IPs would be removed from quarantine, but would still be blocked until the original quarantine period had expired.)
Events Monitoring: Resolved an issue where requests that triggered a Monitor action were not being assigned correct tags for their status.
Security Alerts: Resolved an issue preventing Security Alerts from being created when they were based upon newly-created Dynamic Rules.
Security Policies: Previously, each Policy contained an unused field named "match". This has now been removed.
SSL: Resolved an issue where importing a PFX file with multiple domain names would result in an extra space being added to each name after the initial one.
SSL: Resolved an issue that could occur when renewing multiple certificates; if a certificate could not be renewed, the remaining renewals would not be attempted.
Purging CDN caches: Admins can now purge CDN caches from within L11WAAP, without needing to contact support.
Offload IP blocking to Link11 Layer 3 protection: When a Dynamic Rule is blocking a hostile IP, the blocking can be offloaded to Link11's Layer 3 protection. The hostile requests will be blocked before they reach the WAAP, which will increase performance.
iCloud IP lists: Global Filters now include a list of iCloud IPs, so admins can, if desired, create distinct handling and security rulesets for requests from those IPs.
Log Exporter / Event Streaming: In previous versions, L11WAAP could export log data and stream traffic events to external destinations such as SIEM solutions. This has now been enabled for v5 via the API. Setup details are .
Advanced configuration: Link11 advanced support users can now create customized capabilities for customers by defining custom code in Proxy Templates. Note: This capability should only be used by advanced support, as improper use of this capability can severely damage the system.
API: Resolved an issue where Security Policy path mapping entries were not being validated correctly (duplicate values were being allowed).
Backend Services: Resolved an issue where the interface for new backend creation included an incorrect default value for the Host field.
Events Log: Resolved an issue where selecting an entry to show additional details could display an empty panel.
Dynamic Rules and Rate Limit Rules: OR or AND operators were added to the Include and Exclude tag lists, providing more precision and flexibility when specifying the scope of rule enforcement.
Security Alerts: Resolved an issue where alerts were not being sent.
UI: Resolved several minor issues.
Security Alerts: A security alerting feature has been added (similar to a feature previously available in version 2). When Dynamic Rules are violated, email alerts can be sent to specified addresses.
SSL: Admins can now set SSL protocols and SSL ciphers on a server group level via the API. (Previously, these values were hardcoded in a backend file.)
Publishing Resolved an issue where multiple publish operations in a short time were not succeeding.
Server Groups: Resolved an issue where a domain could be assigned to more than one group.
SSO: Resolved an issue with Azure SSO (from this Microsoft error) where users could not login via PIN or Face ID using the Edge browser.
UI: Resolved some minor issues.
API: The Swagger display has been updated to reflect API v4.2.
API: When a "publish configuration" command is sent before a previous publish operation has completed, a 503 error will be returned. API users should use a retry mechanism to ensure that publish commands are successful.
Global Filters: When creating an IP-based filter, users can now specify ipv6 addresses with subnet > 32
Traffic logs: Requests that are blocked because they caused processing errors are now shown in the logs.
UI: Reblaze logos in the documentation and web console now reflect Reblaze Technologies' new role as part of the Link11 Group.
Dashboard: Resolved an issue where a request with an invalid (null) status would prevent data from being displayed.
Dashboard: Resolved an issue where the Response Status Graph was not filtering results according to user selection of "By Origin" or "By Reblaze".
Events Log: Resolved an issue where a POST request with a malformed JSON payload was not being correctly reflected in the logs.
Events Log: The "Copy Request as Curl" command now includes the protocol in the curl string.
Proxy Templates: When an invalid CIDR is added to the list of Trusted Sources, an error message is now displayed in the UI.
Publishing: Resolved an issue where, when publishing a configuration change, a "validation failed" error could occur if a temporary file already existed.
SSL certificates: Resolved an issue where a failure to renew certificates with more than one domain could cause an internal error.
System performance: Resolved an issue where internal database queries could potentially hang. Now a timeout is enforced; if it is triggered, a 408 code is returned.
Backend Services: it is now possible to
define multiple ports per host for HTTP and HTTPS
define multiple hosts when setting up Port Bridge mode
define multiple ports when setting up the other modes (Per Request, HTTP Always, and HTTPS Always)
Proxy Templates: A new configuration option enables sites to accept requests with client body sizes above 5 MB.
Traffic analytics: In the Dashboard and Events Log, the date/time query control now allows the specification of seconds; previously, only hours and minutes could be specified. Timestamps now default to zero seconds (i.e., the query parameter defaults to the beginning of the specified minute); when seconds are zero, they are not displayed in the timestamps.
API: Resolved an issue with the/accounts/api-keysroute, which was not correctly accepting the API key.
Backend Services: Resolved an issue where Port Bridge Mode was not working correctly for ALBs (application load balancers).
Content Filter Rules: Resolved an issue where a Rule could be configured with an invalid Match parameter.
Edge Functions: Resolved an issue where Edge Function identifiers submitted via the API were not being validated correctly, potentially resulting in 502 errors.
Events Log: Modified the units for Reblaze time (from ms to seconds), so that it is consistent with other metrics.
SSO Configuration: Resolved an issue where Azure SSO was not working correctly.
SSL Certificates: When upgrading from Reblaze v2.x to v5, existing SSL certificates will be retained. However, when they expire, they will not auto-renew. To enable auto-renewal for migrated certificates, contact support.
Events Log: the events display has been revamped and is now easier to use. Selecting an event now displays a window with several sections: the most important data on the top, followed by one or more expandable sections with various categories of additional information.
Edge Functions: when a user defines custom Lua code, its syntax is now validated before being accepted.
Publishing: when a user submits configuration changes for the backend, the changes are now validated before being accepted.
SSL policies: default policies for load balancers are now min tls 1.2 - modern (for GCP) and ELBSecurityPolicy-TLS13-1-2-2021-06 (for AWS). This change applies to new planets only.
Analytics: in the Dashboard and Events Log, the preset time period selectors (e.g., "Last hour") were not being reset when the timeframe changed.
Backend services: when creating a new backend service, it was possible that an internal id would not be assigned correctly.
Content Filter Rules: when creating a new rule, it was possible that an internal id would not be assigned correctly.
Dynamic Rules: if a Rule's ID contained a hyphen, an internal error would occur, and the Rule would not be effectual.
Events Log: when a host name included a port, under certain conditions the port would be appended again.
Events Log: When a request included arguments, the "Copy as Curl" menu option was not composing curl commands correctly.
Events Log: When a request triggered a "Skip" action, under certain conditions it could be reported as a "Block reason".
Events Log: for data-heavy queries, there could be a significant delay between the query's completion and the UI's refresh.
Proxy Templates: when creating a new template, the header host was not being set correctly.
SSL Certificates: the Certificates page in the console would not load if its timeouts were exceeded.
SSL Certificates: all expiring certificates were being renewed. Now, unused certificates are not renewed.
SSL Certificates: under certain conditions, certificate replacements were being reported as having failed, even when they succeeded.
Swagger UI was not correctly accepting load balancer names in the Load Balancer DELETE/PUT API routes.
Tags: for short tags, it was difficult to click on the portion of the tag that opens the Tag Finder.
User accounts: an uncommon structure for email addresses was not being accepted.
UI cleanup: in a few places, long strings were not being displayed correctly. Some inconsistencies in capitalization, font colors, and spacing were corrected.
Events Log: when viewing events that occurred before this software version was deployed, incomplete "block reason" data will be shown for events blocked due to "general reasons" or "content filter rule" violations.
Global Filters: Entries within a Global Filer's Rule can now be edited from within the table. (Previously, they had to be deleted and re-created.)
Backend Services: under certain conditions, users could define multiple hosts in bridge mode.
Dashboard: retrieved data was not always being cleared between searches.
DNS Records: multiple values were concatenated in a single line. Now, they are displayed in separate rows.
Dynamic Rules: Target entry was not displayed correctly if it included an underscore.
Events Log: displayed keys and values could be vertically misaligned.
Events Log: large data files could overflow the text display.
Flow Control: arguments with long strings could overflow the input control.
Login screen: empty input fields were not displaying errors.
Tag Finder: could display incorrect tag usage.
Tag Finder: header row of tags table was too short.
Traffic data queries: certain inputs were not being validated for data types.
Traffic filtering: Headers with invalid (non-UTF) characters would throw runtime errors. Now, they are blocked with 400 response codes.
Web console: "User Guide" link was not pointing to the most recent version.
Web console: various minor issues with table column widths, redundant tooltips, and others.
Traffic filtering: Headers larger than 64k are now supported.
Analytics: the date/time control for queries was accepting AM/PM time specifications. Now, for consistency with graphs and logs, it accepts 24-hour time specifications.
Content Filter Profiles: previously, the "Ignore Content Filter Tags" list accepted all types of tags, and there was different behavior when matches were found for CF tags versus non-CF tags. To improve consistency, this list now only accepts Content Filter Rule and libinjection tags.
Security entities: previously, selecting "New" would create an entity (e.g., a Global Filter) with default values that could be edited. This created friction if the selection of "New" was inadvertent, because the unwanted entity would then need to be deleted. Now, entities are not actually created until the user selects "Save".
Dynamic Rules: when the Action of a Dynamic Rule was changed, any traffic sources currently in quarantine from the Rule did not have their action changed.
Edge Functions: the Edge Function Editor page was not displaying the function's Automatic Tag (edge-function).
Edge Functions: when multiple Edge Functions were assigned to the same path, the Events Log was not reporting all of their tags.
Security Policies: when a Policy did not include any Rate Limit Rules or Edge Functions, the console failed to display a "No data found" message.
SSL Certificates: When certificates were generated from a server group with multiple domains on “Match Host/Authority Headers”, Let's Encrypt was only generating a certificate for the last domain on the list.
Reblaze v5 is released; a thorough restructuring of Reblaze, from UI to architecture. Compared to previous versions, v5 provides a much more intuitive workflow, better analytics, numerous performance enhancements, more powerful traffic filtering, and much more.
When an admin creates an Edge Function, L11WAAP validates the code with a Lua compiler. If any syntax errors are found, an error message will be shown. However, Link11 does not validate the code beyond this. Please ensure that the code is valid and tested before adding it. If the code has errors, undefined behavior can occur when L11WAAP attempts to execute it.
Edge Functions are a very powerful tool. If you need assistance with this feature, please feel free to contact support.
Edge Functions are assigned to destination paths/URLs within Security Policies.
The main window (shown above) lists all current Edge Functions.
The administration (addition/deletion/editing/versioning) of EFs follows the conventions described here.
A name for this EF, to be used within the interface.
Information about this EF, for use within the interface.
This specifies when the Edge Function code will be executed.
Request Pre Processing
Executes immediately when L11WAAP receives an incoming request, before any other processing occurs.
Runs before the security logic.
Cannot be preempted/prevented by the security logic, since it executes beforehand.
A request might only be blocked here if NGINX itself blocks it (e.g., due to malformed headers or connection limits).
Request Post Processing
Executes after L11WAAP has finished processing the request, and before it sends the request to the backend server.
Runs after the security logic.
Will only be reached if the request is allowed by the security logic.
If the request is blocked, this stage will not be executed.
Response Pre Processing
Executes when L11WAAP receives the response from the backend.
Runs on the response coming back from the origin, before any potential processing.
The response cannot be blocked here, as L11WAAP does not evaluate or filter responses from the origin at this stage (unless NGINX does it for some reason).
Response Post Processing
Executes as the last action before L11WAAP sends the response to the client.
Runs after the response has been processed (e.g., the addition of the upstream-status tag) and just before it is sent to the client.
Similar to the previous stage, since there is no security logic evaluating responses, this function cannot be blocked and will execute as normal.
The Lua code for the Edge Function.
The list of Security Policies that include this Edge Function. Each Security Policy defines the scope (i.e., the paths within Backend Services) for which the Function will be active.
For a discussion of how to use this control, see Connections to Security Policies.
Out of the box, Link11 WAAP includes multiple Edge Functions. These can be studied as good illustrations of how to create and use Edge Functions.
Typically, an Edge Function will leverage built-in capabilities of nginx. Link11 WAAP also includes some custom capabilities, described below with examples.
A use case that sometimes arises is to access the Tags attached to the request during L11WAAP's processing, for case-specific purposes (business logic, customized responses, etc.)
This can be done in the Request Post Processing phase, with a custom function [ngx.tag_exist] that returns a boolean. Its usage is as follows:
For example, L11WAAP includes a default Global Filter that adds a tag (cloudfront) to all requests bearing an AWS CloudFront IP. An Edge Function can pass this information to the origin in a header named "is-cloudfront", like this:
An Edge Function can inject custom messages into events. This can be useful for increasing visibility into traffic logs, debugging, etc.
The syntax is as follows:
So, this Edge Function code:
...will add Hello world to the event. This message will appear in:
the Event Log's Messages section (shown below)
and the messages field when retrieving traffic data from the API, or when downloading data from the Events Log.

Revealing the composition and details of your traffic
This page provides the ability to review and analyze the most recent traffic, up to and including real time. It is a powerful tool for traffic control; if a security event occurs, this page will allow you to quickly find its root cause.
Running a query will display a list of requests matching the specified criteria. Each request can be expanded to display additional details.
Executing actions based on a request's tags
When a request is processed by Link11 WAAP, a number of are assigned to it during the early stages of the .
As one of the final stages of processing, the relevant ACL (Access Control List) Profile for this request is evaluated.
The ACL Profile defines what will happen to a request, based on the tags that it contains. Admins can assign a variety of available actions that will be performed.
Actions to perform in response to traffic analysis
Leveraging Link11 WAAP's traffic data
Many security solutions provide information only about the traffic that they block. Contrary to this, Link11 WAAP shows all of the traffic that it receives.
This provides you with a powerful ability to dig into your traffic data and gain deep understanding about the nature and disposition of incoming requests.
Metrics about blocked requests are useful, but their usefulness is multiplied when you can compare them to passed requests. By showing all requests, L11WAAP allows you to understand what "normal" requests look like. This gives you more insights into abnormal traffic.
The Link11 WAAP API includes over a dozen namespaces, each containing a number of routes.
Each namespace has its own page in the documentation, listing all its routes, their parameters, and so on. These pages can be accessed in the left sidebar, in the .
Below is a general guide to the namespaces, showing the type of functionality each one provides. The namespaces can be organized into three broad categories:
// returns true if tag1 was attached to the request, false otherwise
ngx.tag_exist("tag1")
// returns true if tag1 AND tag2 were attached to the request, false otherwise
ngx.tag_exist("tag1","tag2")
// returns true if tag1 OR tag2 were attached to the request, false otherwise
ngx.tag_exist("tag1") || ngx.tag_exist("tag2")ngx.header["is-cloudfront"] = ngx.tag_exist("cloudfront")ngx.ctx.additional_messages = {"$MESSAGE"};ngx.ctx.additional_messages = {"Hello world"};For Proxy Templates: the usage of Advanced Configuration


Hits
Total incoming requests
Humans
Requests originating from humans.
Bots
Requests originating from traffic sources not (yet) verified to be human. Most of the requestors will be bots, but some will not be. More on this below.
Passed
Requests accepted by L11WAAP and passed upstream to the origin (i.e., the web server, API endpoint, etc.).
Blocked
Requests deemed to be hostile, and blocked.
Challenges
Requests that were challenged. The is an important part of L11WAAP's traffic processing, as seen below.
The Dashboard provides a variety of ways to view your traffic. Some of them include all of the above metrics in the same view, while others include a subset.
Link11 WAAP includes a multi-layered mechanism for distinguishing between human users and bots.
In the interface, this mechanism is summarized as "challenges." Requests from non-authenticated users will be challenged, i.e., they will undergo a process through which L11WAAP ascertains if the traffic source can be verified as a human user or not.
When a traffic source successfully passes the challenge, it will not be challenged again for the remainder of the session. For legitimate users, this entire process happens quickly (in a few milliseconds), and is invisible to the user. Users will perceive no impediment or latency in their access to the requested resources.
For more details on this mechanism, see Hostile bot detection.
The process described above will result in the following statistics being incremented.
For each challenge that was not passed:
Hits
Challenge
Bots
If the challenge was passed:
Hits
Challenge
Bots (see explanation below)
Hits (incremented a second time for the post-challenge resubmission of the request)
Passed
Humans
As a result, the Bot count can sometimes be incremented even when the visitors are humans. Examples:
When a human user visits an L11WAAP-protected site for the first time, the first request does not yet have the authenticating cookies.
Static files (images, etc.) are often exempted from challenges for performance reasons. Direct requests for those URLs from a new visitor will not have cookies.
Sometimes, trusted IPs are whitelisted and exempted from challenges. They never receive authenticating cookies.
Therefore, although most of the Bot count represents non-human requests to your web application, the Bot metric is not an exact count of this.
When working with L11WAAP's traffic statistics, the following relationships can be helpful.
Hits = Passed + Blocked + Challenges
Hits = Humans + Bots
The process described on this page is the active challenge process. Out of the box, this is the challenge process that Link11 WAAP uses.
Passive challenges still include Environmental detection and browser verification, while adding three additional benefits:
They enable biometric behavioral verification: a much more powerful means of identifying automated traffic, and an important part of L11WAAP's behavioral analysis.
In some situations, active challenges can interfere with certain metrics such as those provided by Google Analytics. (The initial referrer information is lost.) If this is a problem, active challenges can be disabled. In this situation, passive challenges can provide effective bot protection instead.
When caching is being done by a CDN, active challenges will not occur for pages being served from the cache. Passive challenges are necessary for L11WAAP to perform bot detection in this situation.
To learn more about passive challenges, go here: Enabling passive challenges.
Statistic
Comment
By default, expanding an entry will display all of its data. When a request contains thousands of arguments, or very large arguments, the data retrieval can negatively affect the performance of the Events Log display. If your planet commonly receives such requests, the Events Log can be configured to only retrieve the arguments when the Arguments tab is selected in the Additional Details display, which will improve performance. To enable this, contact support.
The Events Log page contains two primary sections:
Query specification
Query results
This section determines the events, if any, that will be displayed in the Query results section.
The top part of this section is identical to the Query specification section on the Dashboard page, except that it contains a button to transfer the current query criteria to the Dashboard. (Note that in order for the query to transfer, it must have been run already.)
The Events Log also provides three additional controls:
This downloads a JSON file containing complete log data for the requests in the current query results, in this structure:
...where each $REQUEST has this structure:
...and the $FIELDs are the Field names described here.
Selecting this button will display a row of controls at the top of the query results. Entering text into a control will quickly filter the results list, to display only those events which match the filter. For example, to only display "Passed" requests, enter P into the Result control.
This specifies the number (200, 500, 1000, 1500, or 2000) of the results displayed.
When a query is run, a list of matching events is shown. See screenshot at the top of this page for an example.
Clicking on an event will open a window with more information, including two expandable sections: Additional details and Messages. (The latter will only appear if there are messages in the event.)
Some of the data shown comes from the request itself, while some of it was added during L11WAAP's processing. Important information in the latter category includes:
Block reason: if the request was blocked, the reason will be shown. In the example above, a Global Filter blocked the request. (To conserve compute resources, L11WAAP stops processing a request when a blocking action is triggered. Thus, it's possible that additional problems with the request would have been discovered if further stages of traffic filtering had been performed.)
Monitor reason: if the request triggered at least one Action with a Type of "Monitor", the source(s) of this will be shown. Note that Block reasons and Monitor reasons are not mutually exclusive; a request can have both types simultaneously.
Tags: the various tags that were attached to the request during processing, shown in blue. User-defined tags are shown in the top section; system-defined tags are shown in the Additional details section.
Messages: this section appears if the system has added any messages to the event. These can include .
By default, when the Events Log responds to a query, all arguments in the requests will be retrieved. In some environments, incoming requests can contain excessively large arguments, or a large number of arguments, either of which can delay the delivery of the results.
If this situation arises frequently, there is an internal system setting that will defer argument retrieval until a button is clicked (the Show All Arguments button in the Arguments tab). This can improve Events Log performance, and will also make it easier to find specific arguments (because argument data will be displayed in a table with search capabilities).
To enable this feature, contact support. Note that if this setting is enabled, it will no longer be possible to (successfully) run queries based on arguments, since argument data will not be available when the queries are processed.
When security incidents occur, the investigator will frequently submit a succession of queries, often starting from a broad scope and then drilling down into a narrower focus while trying to discern the underlying cause.
L11WAAP provides some tools to make this process easier. When viewing an event, right-clicking on one of its values will reveal a popup menu, as shown below.
The menu options are as follows.
Copy Request as Curl: Copies a curl command containing this request to the clipboard, so that an admin can re-submit that exact request to the system. This can be useful in various situations, e.g., to test a security setting that was modified.
Copy Request as JSON: Copies the request's log data to the clipboard as JSON for further analysis, including the data and tags added by L11WAAP. The log data structure is the same as described above for the Download button, except that only one request will be returned.
Copy Value to Clipboard: Copies whatever was right-clicked to the clipboard.
Show Matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will restrict the results to requests that match the field and value that was selected. In the example above, the following string would be added to the query: result="Blocked by origin".
Hide Matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will exclude requests that match the field and value that was selected. In the example above, the following string would be added to the query: result!="Blocked by origin".
Potentially, a very large request could exceed the maximum allowable size of a log entry. This makes it impossible for the system to capture all the request's data in the log.
In this situation, the system will truncate the log entry by omitting some of the request's details, and the log entry will contain a notice of this.
Omissions will occur in this order:
Additional log entries (the last section in the Events Log)
Parameters (arguments/headers/cookies, but see note below on protected headers), in this order :
Ignored parameters
Examined parameters
Examined parameters that triggered an Action
Monitor reasons
Block reasons that were not final
Content from the main block reason (e.g., a large value of a parameter), noting the omission with an ellipsis (...)
Requests with large (longer than 500 characters) malformed bodies will have their bodies truncated in the Events Log, and in the events exported via Log Exporters.
In the event data, the body will be preceded by this message: The request contains a malformed body (displaying only first 500 characters):.
Note: 500 characters is the default limit, but this can be changed if necessary. To do this, contact Customer Support.
If a POST request with content-type: application/json contains a malformed JSON payload, the system will not be able to process the payload.
The event data (in the Events Log entry and any active Log Exporters) will contain an error message, noting that a malformed body was received. However, the system will be unable to parse the body to count the number of arguments. Thus, in the event data, the request will have a tag of args:0, even though strictly speaking, arguments might have been present.
Note also that the payload will not be subjected to content filtering. Thus, the disposition of the request will depend solely on whether or not it violated other security rulesets (e.g., rate limiting).

An ACL Profile is assigned to paths/URLs within applications and APIs via Security Policies.
When a request is received, the system checks its destination URL, and uses the ACL Profile that best matches it.
Out of the box, the system includes a default ACL Profile. It can (and usually should) be edited, but it cannot be deleted. It is used for all URLs where no other Profile has been assigned.
The main page lists all current ACL Profiles.
The administration (addition/deletion/editing/versioning) of Profiles follows the conventions described here.
Each ACL Profile consists of the following:
Six ACL Lists, shown in the UI as six columns organized into four sections. (These Lists are not labeled in the interface, but ACL Lists will be our designation here in the documentation.) Each List contains zero or more tags; these tags are compared to the request's tags. The first List with a matching tag causes an event to occur. See the full explanation of this process below.
An Action to execute under certain circumstances (see below).
Tags that are attached to requests that are evaluated using this Profile.
General parameters for administration.
As mentioned above, an ACL Profile includes six ACL Lists, each of which is shown in a separate column in the interface. Each one includes a list of zero or more tags.
When a request is processed, its tags are compared to the ones in the Lists. The Lists are evaluated in order from left to right.
If a match is not found, the next List is evaluated.
If a match is found, then one of the following occurs:
The request is subjected to a bot challenge. If it passes, ACL processing continues.
The request is exempted from bot challenges, and ACL processing continues.
The request is passed to the Content Filter Profile for further inspection.
The request is passed, and is exempted from content filtering.
The is executed, and processing ends.
Here is a flowchart of this process, with the evaluation of each ACL List column shown as a decision.
Enforce Deny
Triggers the Action. (In most situations, admins will choose an action that blocks the request. This is a useful way to quickly filter out, with minimal computing overhead, large numbers of requests that are obviously hostile or otherwise unwanted.)
Bypass
Allows the request, and bypasses/exempts it from subsequent evaluation by Content Filter Profiles. (Note that any Response phase will still be executed.)
Bot Challenge / Skip
Skip the Bot Challenge / Apply stage (the process by which non-human traffic is identified and blocked), and continue processing. An example usage is to allow search engine spiders.
Bot Challenge / Apply
If the requestor has not previously been verified to be human, a bot challenge will be issued. If the challenge is passed, the request will continue in the evaluation process. Otherwise the Action is triggered. A common use of this column is to add the all tag, which means to challenge all requests that haven't already passed a challenge, or didn't match a tag in Bypass or Bot Challenge / Skip.
Block / Skip
Passes the request to the Content Filter Profile process for further inspection.
Be cautious when adding the "all" tag to an ACL List. In most situations, that action will be performed for all requests for which a match was not found in any columns to the left.
One common use is the Bot Challenge / Apply column, as noted above. This means that all requestors (except for those which matched one of the columns to the left) will be challenged and verified to be humans.
Another possible use is to place "all" in the Block / Apply column, to create a positive security model. (This will block all requests which did not explicitly meet any of the conditions for Bypass or Block / Skip.) But even this usage can be risky. Unless all the potential conditions for allowing a request are fully and correctly defined, this can result in False Positive errors, and some legitimate requests will be blocked and filtered.
In other columns, "all" can have serious consequences. For example, placing it in the Enforce Deny column will block all incoming traffic to which this ACL Profile is applied. On the other hand, placing it in the Bypass column will allow all incoming traffic (and exempt it from being scrubbed by the Content Filter Profiles!), except for those requests which matched a tag in the Enforce Deny column.
Summary: before using the "all" tag in an ACL Profile, carefully consider its ramifications.
These six columns are explained above: How an ACL Profile works.
A name for this Profile, to be used within the interface. A system tag (shown below the Tags field) will include it as well.
Information about this Profile, for use within the interface.
The action that is performed when a request matches a tag in Enforce Deny or Block / Apply, or the requestor fails a bot challenge. The actions available here are the defined Actions that are relevant for the Enforce Deny and Block / Apply columns (thus, "monitor" and "challenge" types aren't available here).
A list of one or more tags, separated by spaces. Whenever this ACL Profile is used to evaluate a request, these tags will appear in the traffic logs.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.

Actions are available at various stages of the traffic filtering process, e.g. Global Filters, Rate Limit Rules, ACL Profiles, and Content Filter Profiles.
As shown in the diagram below, different types of Actions can occur at various stages. An Action can terminate the processing of a request by blocking it, but other Actions (Skip, Challenge, and Monitor) are available as well, with different outcomes. See the description below of the Type parameter.
The main page lists all current Actions.
The administration (addition/deletion/editing/versioning) of Actions follows the conventions described here.
An Action consists of the following:
The Type of the action
Additional Type-specific parameters
Tag(s) to attach to requests that triggered this action
General parameters for administration
A name for this Action, to be used within the interface.
Information about this Action, for use within the interface.
This parameter will be one of the values below.
Skip
Adds the tag(s) to the request, then skips the remainder of the traffic evaluation process (similar to the Bypass option in ). Note that any Response phase will still be executed (as they are not part of the evaluation process).
Block
Adds the tag(s) to the request, and sends a response to the user with the defined Response headers, Status code, and Content.
Challenge
Adds the tag(s) to the request, and issues a to verify that the user is human.
Interactive Challenge
Adds the tag(s) to the request, and issues an to verify that the user is human.
Monitor
Adds the tag(s) to the request, and continues to the next stage of without responding to the user. Admins can also define Request headers to add to the request as it is passed upstream.
Sometimes Link11 WAAP must choose one of several potential Actions. For example, when a request matches the conditions for multiple Global Filters, each Filter will include an Action. The system must execute the highest-priority one.
The priority hierarchy is, from highest to lowest:
Skip
Block
Challenges (bot and/or interactive)
Monitor
A list of one or more tags, separated by spaces. When this Action is triggered, these tags will appear in the traffic logs.
Additional header(s) to add to the request, which will be sent to the backend.
The status code returned to the user.
A list of header(s) to add to the response that is sent to the user, specified as the header name and its value. Example: content-type and text/html.
The response sent to the user, of the appropriate format and type. Example: if there is a Request Header of content-type and text/html, then this should begin with <html> and end with </html>.
This field can contain tokens (preceded and followed by %, as shown in the example below), to customize the response sent to the client:
Client_IP
The client's IP address
Timestamp
The request's timestamp
Status_Code
The HTTP status code being returned to the client
Host_Domain
Domain of the destination URL
Request_ID
A unique identifier for the request, used internally by Link11 WAAP (and which also appears in the Events Log)
Session_ID
A unique identifier for the client's session, used internally by Link11 WAAP (and which also appears in the Events Log)
By default, Link11 WAAP comes with a rich HTML page, as shown in the screenshot above.
Here's an example of the Content for a simpler token-based response:

The discussion below assumes you are already familiar with Query Filter Syntax and Best Practices.
L11WAAP provides multiple ways to view your traffic. The discussion below will focus on the Events Log. Similar tactics can be applied when viewing different parts of the Dashboard.
Sometimes the Events Log is used to answer a specific question about a request or a traffic source. At other times, it might be a more general exploration; for example, a beginning-of-the-day review of what happened over the last 24 hours.
Let's discuss the latter scenario (a general exploration). Because the Events Log shows all requests, it can be overwhelming. It's helpful to start by excluding requests that aren't as relevant to your current purpose. Examples:
Exclude passed requests: result!="Passed"
Exclude requests being rejected by the origin (i.e., the upstream server): result!="Blocked by origin"
Exclude requests from a banned IP: tags!="ip:192-168-2-3".
Exclude requests that are obviously invalid. For example, exclude those with unrecognized host headers: reason~"unrecognized".
Eventually, you can filter the display down to a list of challenges or blocked requests that might produce some insights.
From this point, you are looking for possible patterns, or unusual outliers, and considering possible actions to take. For example:
Are there a lot of requests for a Wordpress file, but your site does not use Wordpress? These are coming from malicious traffic sources. It might be useful to set up a Dynamic Rule, e.g. to Ban requestors who submit more than one request for that file in a three-minute period.
Is the same IP failing multiple challenges? It might be interesting to filter on that IP only, and go through all of its activity, to see what that traffic source was trying to do. (You can see that a challenge is being failed when the challenge itself appears in the logs, but it is not followed by a successful request by the IP for the same URI.)
Are there many blocked requests for the same URI, but from different traffic sources? This might be a False Positive alarm. See below for more on this.
There is no set procedure for this process. Essentially, you are browsing the list of challenges or blocked requests, thinking about why you are seeing the entries there, and asking further questions.
Sometimes, request data will be encoded. Here's an example of an XSS attempt:
default.site/api/?a==
%3c%73%63%72%69%70%74%3e%77%69%6e%64%6f%77%2e%6f%6e%6c%6f%61%64%20%3d%20%66%75%6e%63%74%69%6f%6e%28%29%20%7b%76%61%72%20%6c%69%6e%6b%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%73%42%79%54%61%67%4e%61%6d%65%28%22%61%22%29%3b%6c%69%6e%6b%5b%30%5d%2e%68%72%65%66%3d%22%68%74%74%70%3a%2f%2f%61%74%74%61%63%6b%65%72%2d%73%69%74%65%2e%63%6f%6d%2f%22%3b%7d%3c%2f%73%63%72%69%70%74%3e
In plain text, this is:
default.site/api/?a==window.onload = function() {var link=document.getElementsByTagName("a");link[0].href="http://attacker-site.com/";}]
L11WAAP will decode many requests, but not necessarily all. For example, double-encoded requests will only have their first level of encoding undone.
In these cases, you can right-click on the string in the UI (for example, the Block Reason field), select Copy Value To Clipboard, and run it through decoding tools. (For example, http://0xcc.net/jsescape/.)
A “False Positive” (FP) alarm occurs when a security system misinterprets a non-malicious activity as an attack. These errors are a critical issue for cybersecurity.
Although it might seem that FP errors do not necessarily have serious consequences, incorrect security alerts can lead to significant monetary losses. For example, an e-commerce site might incorrectly exclude real online shoppers. Or, it might reject "good" web crawlers, which would reduce its Internet visibility.
FP diagnosis is often done when L11WAAP is first deployed, before it has been fine-tuned for the customer's applications. It can also be done later, when you discover that certain requests are being blocked, but you do not understand why.
When examining blocked request(s), it can be helpful to ask questions such as the following.
Sometimes an application will expect and accept inputs that L11WAAP blocks by default. Example: the site might use a CMS which accepts HTML/Javascript POST requests. However, out of the box, the system is often configured to block requests containing POST. Thus, L11WAAP would need to be re-configured to match the application it is protecting.
If the range of valid inputs has changed, but L11WAAP was not re-configured, then FP errors can result.
Is the block happening to multiple users?
If a single IP is being blocked, but other requestors for the same URI are being allowed through, the block is more likely to be the correct response to this IP's request. This is especially true when the single IP has attempted other questionable activities.
Conversely, if multiple requestors are being blocked, and they seem to be innocuous otherwise, this indicates the problem might be a FP.
There are some situations where a request is blocked even though the system has no obvious reason to be blocking it. This can occur when L11WAAP is not actually the entity making the decision.
The upstream server can reject requests. These requests can be displayed in the Events Log with result~"origin" as the filter.
L11WAAP can use external sources of information. Out of the box, L11WAAP includes a number of Global Filters based on threat intelligence feeds. Although a given traffic source might not be triggering any of L11WAAP's explicitly-configured security settings, it can still be blocked based on factors such as these.
Example: a web user visited a landing page, entered contact details into a form, and then tried to proceed to the next page. However, the request to proceed was blocked.
This could be a FP due to "junk input." Perhaps the user entered a phone number of "1111111111" and it was rejected by the upstream application. Or perhaps the page itself autocompleted a field and inadvertently created junk input on its own.
If requestors are being blocked for violating rate limits, and the rate limits are very stringent, then perhaps the limits are too tight, and they need to be relaxed.
Or, perhaps the block is the result of content filtering. This feature is powerful, and it is possible to mistakenly configure it to be too restrictive.
Example: requests are being blocked because of a Content Filter Rule that contains this Match condition:
(?i)(select|create|drop|\<|>|alert)\W
The admin wrote this regex in order to identify SQL injection attempts (i.e, SELECT, CREATE, and DROP commands. Normally SQL and code injection attempts are blocked automatically by L11WAAP, but occasionally customers choose to disable this).
Now let's examine one of the blocked requests in the Events Log. It contains this:
https://www.pinterest.com/pin/create/button/?url=https%3A%2F%2Fexample.com%2Fpitbull-2012%3Frt%3Dstorefront%26rp%3Dpitbull%26rn%3DPitbull%26s%3Dhanes-S04V%26c%3DBlack%26p%3DFRONT&media=&description=
This can be decoded with a tool such as http://0xcc.net/jsescape/. It now becomes this:
https://www.pinterest.com/pin/create/button/?url=https://example.com/pitbull-2012?rt=storefront&rp=pitbull&rn=Pitbull&s=hanes-S04V&c=Black&p=FRONT&media=&description=
Now let's see why the regex condition matched the request. On https://www.debuggex.com/, it's possible to paste in regex and a string, and see if/where a match occurs.
Notice the highlighted (in yellow) part of the string in the bottom textbox. This shows which part of the bottom string matches with the regex in the box above it.
We see that the expression that was meant to identify an SQL command of CREATE, is also matching with the URL generated by a user who was trying to feature this site's product on Pinterest.
This indicates that the regex should probably be modified, so that it only accomplishes its intended purpose. In this example, it could be modified as follows:
(?i)(\sselect|\screate|\sdrop|\<|>|alert)\W
This would require a space to be found before each potential SQL command, thus eliminating matches when those words are found in a URL.
As mentioned earlier, there is no set procedure for the process of identifying the underlying reasons why requests are blocked. It requires digging into the requests, gathering data, and asking questions.
Hopefully the examples above are helpful in illustrating the necessary thought process, and some of the tools that are available.
Security settings
Site-related settings
Other capabilities
For managing the services L11WAAP is protecting.
For managing SSL certificates.
For running custom Lua code.
For managing SSL associated with load balancers.
For configuring Mobile SDK parameters.
For managing architectural parameters.
For managing , the fundamental internal data structure
For and managing
For such as a SIEM solution
For planet-level settings such as
For retrieval of data
For miscellaneous capabilities, including
This section defines Server Groups: the highest level of organization within Link11 WAAP. A Server Group is based on a Proxy Template, and contains at least one SSL Certificate and a Security Policy.
The usage of Server Groups is explained in detail here: .
Typically, a Server Group represents a single domain.
The main window (shown above) lists all currently defined Server Groups.
The administration (addition/deletion/editing/versioning) of these Groups follows the conventions described .
A name for this Server Group, to be used within the interface.
The domain to use when are issued.
Information about this Server Group, to be used within the interface.
The scope for this Server Group (typically this is a list of domains), specified as a regex. If this list is edited, the edits must be saved before .
The for this Server Group, with its parameters displayed for convenience.
The that this Server Group is based upon.
The for this Server Group, if any.
The for this Server Group. The Generate button will generate a new certificate.
The CA Certificate to use when enforcing mTLS for the domain (). The available certificates are those defined in the CA Certificates tab of the page.
In use, CA certificates are verified against the CRLs in the .
CA Certificate features will only be available if both of the following are true:
An AWS NLB (Network Load Balancer is being used. (When using a Link11 Load Balancer, contact support.)
CA Certificates have been .
Specifies how clients (i.e., end users) should present CA certificates for mTLS validation. Options are:
[Off] Client authentication is disabled. The system will not request CA certificates from clients.
[On] CA certificate is required for authentication. The system will request and validate CA certificates from clients.
[Optional] CA certificate is requested but not required for authentication. The system will not require clients to provide CA certificates. However, if a client does provide a certificate, it must be valid in order for its request to be accepted. If the client provides an invalid certificate (e.g., expired, revoked, or forged), the request will be blocked.
When CA Certificates are enabled, Link11 WAAP will add headers to requests before passing them to the backend.
If a CA Certificate is provided, Link11 WAAP will add it to the request header, along with these additional headers:
If no certificate is provided, the following headers will be passed:
Link11 supports CRLs (Client Revocation Lists). Admins can revoke client certificates that were previously allowed for mTLS authentication, so that unauthorized or compromised clients will be rejected without waiting for certificate expiration.
When Enable CRL validation is enabled, admins can add entries to the Client Revocation List. Each entry is a URL of a CRL.
During mTLS negotiation, if a CA certificate has been specified, the client certificate is validated against the specified CRL(s).
If the certificate is revoked, the connection is rejected with a status code of 496. The Events Log will contain an entry with a Block reason of “General: Client certificate revoked.”
If the certificate is signed by another CA, the connection is rejected with a status code of 495. The Events Log will contain an entry with a Block reason of “General: Client certificate could not be verified.”
If the certificate is not in the CRL, the connection succeeds (assuming other validation checks pass).
This section defines the Backend Services that Link11 WAAP will protect. In other words, these are the destinations to which Link11 WAAP will send the (legitimate) traffic it receives.
A Service consists of one or more endpoints (defined in the , discussed below). Each Service can receive traffic for multiple web applications, and for multiple resources/locations within each web application.
For a single Service, you can define multiple endpoints. Within them you can:
Enable and configure load balancing, weighting and distributing traffic across your primary endpoints.
Define backups hosts, to which L11WAAP will failover your traffic when your primary hosts aren’t available.
Take hosts offline for maintenance by ticking a single box in the interface.
Backend Services are designated to receive traffic for specific destination URLs in .
The main window (shown above) lists all currently defined Backend Services.
The administration (addition/deletion/editing/versioning) of these Services follows the conventions described .
A name for this Service, to be used within the interface.
Enables HTTP 1.1, which can increase performance due to multiplexing.
Information about this Service, for use within the interface.
This configures the communication between L11WAAP and the backend.
Sometimes an application requires a user to be connected to the same instance and backend endpoint throughout the session. L11WAAP can ensure that this occurs, and can do so using a variety of methods.
The certificate to use for mTLS communication between Link11 WAAP and the customer origin.
The available certificates are those defined in the Server-to-Backend mTLS Certificates tab of the page.
To use this feature, it must first be .
This is a list of one or more endpoints. The settings for each endpoint in the list are as follows.
Applying security rules to paths and resources
Security Policies assign security rulesets to specific paths within applications and APIs. When a request is received, Link11 WAAP finds the Security Policy assigned to its destination Server Group (i.e., the destination site). That Policy then specifies the security rules to enforce upon the request, according to its destination URL.
Each Security Policy also includes a definition of the Session ID to use within its scope. This is an important setting, as discussed below.
Banning or monitoring traffic sources that violated defined limits
The Dynamic Rules section defines security rulesets that evaluate various criteria over time. When traffic sources commit activities that exceed defined thresholds, those traffic sources can be banned, or merely reported on within the Dashboard and Events Log.
Note that Dynamic Rules do not block individual requests based on their content; they define actions to take against the sources of requests. Individual incoming requests are blocked elsewhere, e.g., in or in processing stages that include .
[{$REQUEST1},{$REQUEST2},...{$REQUESTn}]$FIELD1:$VALUE1,
$FIELD2:$VALUE2,
...
$FIELDn:$VALUEnAccess Denied
Request was:
received at %Timestamp%
from IP address %Client_IP%
sent to %Host_Domain%
and was answered with response code %Status_Code%.For managing site-level properties. More info
For management of users and API keys






Block / Apply
Triggers the Action.




Unique serial number of the client certificate
1234567890ABCDEF
SSL_CLIENT_FINGERPRINT
SHA-1 fingerprint of the client certificate
5F:7C:1E:2B:...
Empty (no serial number since no cert exists)
-
SSL_CLIENT_FINGERPRINT
Empty (no fingerprint since no cert exists)
-
Header
Description
Example Value
SSL_CLIENT_VERIFY
Client certificate verification status
SUCCESS (valid) / FAILED (invalid)
SSL_CLIENT_CERT
Full client certificate in URL encoded
-----BEGIN CERTIFICATE----- ...
SSL_CLIENT_S_DN
Client's Subject Distinguished Name (DN)
CN=John Doe, O=ExampleCorp, C=US
SSL_CLIENT_I_DN
Issuer (CA) Distinguished Name (DN)
CN=Example CA, O=ExampleCorp, C=US
Header
Description
Example Value
SSL_CLIENT_VERIFY
Indicates no client certificate was provided
NONE
SSL_CLIENT_CERT
Empty (not passed or -)
-
SSL_CLIENT_S_DN
Empty (no subject DN since no cert exists)
-
SSL_CLIENT_I_DN
Empty (no issuer DN since no cert exists)
-



SSL_CLIENT_SERIAL
SSL_CLIENT_SERIAL
When a server fails, this is the length of time in seconds that L11WAAP will wait before trying to send traffic to it again.
Is Down?
When this box is checked, L11WAAP will not attempt to communicate with this server. This allows you to take a server offline for temporary maintenance or some other purpose.
Option
Value
Per Request
This is the default mode. Incoming HTTP requests will go over HTTP, and incoming HTTPS requests will go over HTTPS.
HTTP Always
All communication between L11WAAP and the backend will be over HTTP. (This mode should not be used unless L11WAAP runs within the same cloud as the backend.)
HTTPS Always
All communication between L11WAAP and the backend will be over HTTPS.
Port Bridge Mode
Link11 WAAP will use the same port as the incoming request. This is not limited to ports 80 and 443; L11WAAP will use whatever port was specified. Note: this mode is not available when more than one host is defined.
Setting
Behavior
None
This is the default. Requests will be distributed across the endpoints in a round-robin fashion, according to the Weights assigned to them (described below in the ).
Auto Cookie
L11WAAP will automatically generate a cookie to maintain the session on the same endpoint.
Custom Cookie
You can provide the name of the cookie that L11WAAP will use to track the session, e.g. one generated by an AWS or GCP load balancer.
IP Hash
Routing will be determined from a hash of the client and destination IP addresses.
Least Connection
Requests will be sent to the endpoint with the fewest number of connections.
Attribute
Description
Host
The name or IP address for each endpoint that L11WAAP protects. (Do not enter self-referential values such as 127.0.0.0/8, 0.0.0.0, ::1/128, ::0/128 or “localhost”.) The host can be a normal web server, or it can be a load-balancer. Note that L11WAAP also provides load-balancing capabilities in its own right, as discussed below. In Port Bridge Mode, it is possible to specify more than one host, separated by commas (as in the screenshot above).
HTTP Port
The HTTP port(s) for the server. To add a port, click in the field, and enter the port number into the "Search" field.
HTTPS Port
The HTTPS port(s) for the server. To add a port, click in the field, and enter the port number into the "Search" field.
Weight
The relative weight of each server for load-balancing purposes. L11WAAP distributes traffic with a round-robin sequence, according to these weights. For example, if two servers are both set to 'weight=1', they will receive equal amounts of traffic. If the first is set to 'weight=3' while the second is set to 'weight=1', the first server will receive three visitors for every single visitor that the second server receives.
Max Fails
The maximum number of failed communication attempts that are allowed for this server. Once this number of failures occurs, L11WAAP will consider the server to be inactive. If other servers are available, L11WAAP will failover the traffic to them. If this was the only server available, the system will return an error to the client (either 504 Timeout, or 502 Bad Gateway).



Fail Timeout
Some system tags are always attached to the request. Other tags will vary, depending on the policies and security rulesets that were applied, or the disposition of the request.
Admins can define additional user tags for specific circumstances.
During processing, tags can be used to make decisions about how the request is handled. For example, an ACL Profile might block all requests that contain a specific tag.
Tags will also be attached to reflect decisions that were made. For example, a request that was blocked because it violated a Rate Limit Rule will be assigned a tag containing that Rate Limit Rule's name.
Once processing is complete, all of the request's tags are included in the traffic analytics and logs. They can also be accessed by Edge Functions.
As mentioned above, there are two types of tags:
System tags are created automatically by L11WAAP.
User tags are defined by admins.
System tags are attached to the request at different stages of traffic processing. In the UI, they are displayed in blue, as in this Security Policy example:
One of the earliest stages of the traffic filtering process is the Initialization stage. Here, L11WAAP attaches a variety of tags to the request, based on its characteristics.
Every request receives certain tags, including all and several tags according to its source (the IP address, geolocation, etc.).
all
geo-country:france
geo-city:paris
geo-region:idf
geo-subregion:75
geo-continent-code:eu
geo-asn:12322
geo-continent-name:europe
ip:82-64-131-193
As L11WAAP processes a request, it will attach system tags to reflect what happened to the request during processing.
Some types of system tags will always be attached (assuming that the request makes it far enough into the processing sequence). For example, every request receives tags that reflect the Security Policy that it matched.
Other system tags will depend on the disposition of the request. For example, requests which violate a security ruleset (such as a Rate Limit Rule) or fulfill a condition (such as being the last request in a Flow Control Policy sequence) will receive tags with descriptive names.
System tags that can potentially be attached are shown at the appropriate places in the UI (generally, in the Editor page for a security ruleset or setting).
bot or human (bot is assigned to all requests unless the traffic source passes a bot challenge, in which case its requests receive human)
sent-to-origin L11WAAP passed the request and sent it to the customer origin
upstream-status:xxx The response status code from the customer origin, if any
(Note: below, xxxis a placeholder for the name of the entity that was used.)
aclname:xxx
securitypolicy-entry:xxx
securitypolicy:xxx
contentfilterid:xxx
contentfiltername:xxx
cf-rule-id:xxx
cf-rule-category:xxx
cf-rule-subcategory:xxx
cf-rule-risk:xxx
If a request matches a libinjection check during Content Filtering, the following tags will be added:
cf-rule-id:libinjection-sqli or -xss (per case)
cf-rule-risk:libinjection
cf-rule-category:libinjection
cf-rule-subcategory:libinjection-sqli or -xss (per case)
User tags are defined and configured by admins, typically in a Tags field in a ruleset Editor page.
Admin-defined tags do not replace the system tags. Rather, when a request triggers a security ruleset, all of the specified tags (system and user) are attached to it.
Admin-defined Tags are created and selected via the Tags dropdown list. Initially, it appears as in this Security Policy example:
When expanded, the Tags list looks like this:
To add an existing user tag, find it in the list (or start typing its name into the Search field), and select its checkbox.
To define a new user tag, type its name into the Search field and hit Enter. The tag will be created, and will be automatically selected for use.
When editing a security entity, hovering the cursor over the Tags control will display an X at the end of the control. Clicking on this will remove all tags from the entity.
As shown above, hovering over a tag will also show an x on that tag. Click on it to remove only this specific tag from the entity.
When a tag is removed from an entity, and no other entity uses this tag, it will also be removed from the list of available tags displayed within the Tags list.
If it is needed again in the future, it can be restored by defining it again as a new tag (i.e., by entering it into the Search field and selecting Enter).
Sometimes, admins will wish to see a list of all uses of a specific tag. Examples:
When examining a request in the Events Log, an admin might want to verify the source of a particular tag.
When editing a security configuration, it can be useful to see which other configurations generate or rely on a particular tag.
An admin might also want to see all requests in the Events Log which had a specific tag attached.
For this purpose, L11WAAP provides the Tag Finder feature.
The Tag Finder lists all current usages of a given tag. It works for both system tags and user tags.
To open the Tag Finder in the UI, simply click the tag. Here's an example (a tag named static-content) from a Global Filter:
When a tag is clicked, the Tag Finder panel will appear with a list of all the entities that use or can generate that tag:
In this example, along with the Global Filter that is currently being edited, the tag is also used in two Rate Limit Rules.
As shown above, hovering the cursor over an entry will display a button that will open the relevant security entity in a "Viewer" (read-only) window, where its attributes are displayed.
At the bottom, there is also a button to open the Events Log, pre-populated with a filter to display all requests that have this tag attached. (This button does not appear if the Events Log is already open.)
Security Policies are used within Server Groups. Every Server Group includes a Security Policy.
Every L11WAAP deployment contains a default Security Policy. This default Policy cannot be deleted. Admins can define additional Policies as well.
The main page (shown at the top of the page) lists all current Security Policies.
The administration (addition/deletion/editing/versioning) of Policies follows the conventions described here.
Each Security Policy contains the following:
A list of paths or scopes within which this Policy will be applied.
The Content Filter Profile, ACL Profile, and (optional) Rate Limit Rule(s) that will be enforced on requests sent to the specified paths.
Optional Edge Functions(s) to run when requests are sent to the specified paths.
One or more Tags that will be attached to requests sent to the specified paths.
What to use as a Session ID for requests sent to the specified paths. This is used elsewhere by the system; for example, .
General parameters for administration.
A name for this Policy, to be used within the interface. A system tag (shown below the Tags field) will include it as well.
Information about this Policy, for use within the interface.
A list of one or more tags, separated by spaces. Whenever this Security Policy is applied to a request, these tags will appear in the Events Log.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.
Some types of settings within L11WAAP allow admins to track user activity and enforce security rules based on the user's Session ID. (Examples of this include Flow Control Policies and Rate Limit Rules.)
However, the definition of a Session ID can vary. The optimal combination of request parameters can differ, depending on the circumstances.
The Main Session ID and Other Session IDs define the request parameters that should be combined and used as the Session ID within the scope of this Security Policy.
Main Session ID: This is the header, cookie, argument, or attribute that will be the Session ID by default.
Other Session IDs: This is a list of additional headers, cookies, arguments, and/or attributes that might, or might not, be available, depending on the situation. When they are available, they are combined with the Main Session ID to form the Session ID used by L11WAAP.
Example: the Main Session ID is set to Header / user_id, and Other Session IDs contains one entry for an authentication token (Header / auth_token). Initially, the Session ID will consist of the user_id alone. Once the user is authenticated and the requests begin to include auth_token too, the Session ID will then be a combination of those two values.
Another example: the Main Session ID is set to Header / user_id. In Other Session IDs, there is one definition (Header / device_id) for a field that is sent by a mobile application.
If the user is using the mobile application, then device_id will be included in the incoming requests, and the Session ID will be a combination of user_id and device_id.
If the user is using a browser instead, then device_id will not be defined, and the Session ID will consist solely of user_id.
This is a list of paths, and the security settings (Content Filter Profiles, ACL Profiles, Backend Service, Rate Limit Rules, and Edge Functions) assigned to each one.
Every incoming request targets a specific URL. L11WAAP finds the best match for that URL in the Path Mapping list, and applies the security settings defined for it, along with whatever settings are contained in the special Site Level path definition (see below).
Out of the box, Security Policies can contain three special path definitions:
Root: Will be selected for requests sent to the root level of the site.
Site Level: Will be selected for all requests sent to the site (see note below).
Default: Will be selected for requests that do not match any other specific path definitions.
A new Security Policy will include several Path Maps. Clicking on a listing will expand it for editing.
To add a new Path Map, select an existing one, expand it, and select "Fork Path Mapping" at the bottom. The existing one will be cloned, and the new one will be displayed for editing.
Field
Value
Name
A descriptive label for use within the interface.
Path or Expression
An expression for the path, expressed as PCRE (Perl Compatible Regular Expressions).
Content Filter Profile
The applied to this path. Its name will be displayed in green if it is active; if displayed in red, it is currently disabled.
ACL Profile
The applied to this path. Its name will be displayed in green if it is active; if displayed in red, it is currently disabled.
Backend service
The associated with this path. Requests that pass through L11WAAP without being blocked will be forwarded here.
In addition to editing the fields discussed above, the expanded Path Mapping dialog also provides the ability to:
Activate or deactivate the Content Filter Profile (by changing its active mode toggle).
Activate or deactivate the ACL Profile (by changing its active mode toggle).
Add an existing Rate Limit Rule to this Path Map, via the + New button. (The + New button will only be shown if there are Rate Limit Rules available.) An existing Rate Limit Rule can be removed by selecting the trash icon at the end of its entry.
Add an existing Edge Function to this Path Map, via the + New button. (The + New button will only be shown if there are Edge Functions available.) An existing Edge Function can be removed by selecting the trash icon at the end of its entry.
Create a copy of this Path Map, and open it for editing, via the "Fork Path Mapping" button.

However, there is an important difference:
Rate Limit Rules are evaluated while an incoming request is being processed. A violation will result in an action being taken against that request.
Dynamic Rules are evaluated later, during periodic queries of the traffic logs. They are used to examine requests in the traffic log that have already been passed or blocked. A violation will result in an action being taken against future requests from the responsible traffic source.
Dynamic Rules have many potential uses. A common one arises from the nature of Rate Limit Rules, which can only block persistent attackers for short periods of time (as discussed here). Dynamic Rules can place violators into quarantine for extended periods of time, during which all requests from those traffic sources are blocked.
Lastly, although Dynamic Rules are commonly used with Rate Limit Rules, they can be used independently as well, and have many other potential applications.
Dynamic Rules work together with Global Filters and the Quarantine list.
When a Dynamic Rule is created, Link11 WAAP auto-generates a corresponding dynamic Global Filter. Initially, the Global Filter will not have any effect on incoming traffic.
As incoming requests are received and processed, L11WAAP periodically queries the traffic logs, and uses the Dynamic Rules to evaluate the most recent requests.
When a traffic source is found to have violated a Dynamic Rule, the following occurs:
A Security Alert will be sent (if any were configured for this Dynamic Rule and the relevant Server Group).
The Rule's Global Filter is updated automatically to include the offending traffic source.
The traffic source is added to the Quarantine list.
For all subsequent requests from that traffic source, the Global Filter will:
Attach the Dynamic Rule's Tags
And execute the Rule's Action.
This situation will continue until either of the following occurs:
The Rule's Quarantine time expires
Or an admin manually removes the traffic source from the Quarantine list (see more below about the effects of this).
At that point, the traffic source will no longer be on the Quarantine list, and will also be removed from the Global Filter.
When the planet is deployed on a Link11 private cloud, and a Dynamic Rule is configured with an IP blocking action, admins have the ability to offload the IP blocking to Link11's Layer 3 protection. During DDoS attacks, these requests will be blocked before they reach L11WAAP; therefore, this will increase performance, and reduce the scaling necessary for the system to handle the attack. During this time, the traffic sources will still be listed on the Quarantined page, and will be designated there as having been offloaded.
Note that while offloaded blocking is occurring, the blocked requests will not be received by L11WAAP; thus, they will not be counted toward violations of other Dynamic Rules or Rate Limit Rules.
Traffic sources can be exempted from Dynamic Rule enforcement by adding one of their tags to the Rule's Exclude list.
If a traffic source is being incorrectly quarantined, it should be manually deleted from the Quarantined list. The next time that Dynamic Rules are evaluated, the following will occur:
The quarantine will end.
The Dynamic Rule's corresponding Global Filter will be updated, so that requests from this traffic source will no longer receive the Rule's Tags and Action.
The Dynamic Rule will be automatically updated to allowlist the traffic source, by adding a tag for the traffic source's IP (or whatever identifier is being used as the Target) to the Exclude list.
Unlike some other types of security settings, Dynamic Rules are not assigned to paths in Security Policies.
Instead, each Policy has its applicable scope defined by the Active mode, Include, and Exclude parameters, as described below.
The main window (shown above) lists all current Dynamic Rules.
The administration (addition/deletion/editing/versioning) of Dynamic Rules follows the conventions described here.
A Dynamic Rule consists of the following:
Parameters defining its applicable scope [Active mode, Include, and Exclude]
The definition of an entity, i.e. how to combine incoming requests for counting purposes [Target]
The behavioral limits for each entity [Number of events, Time frame]
What the system should do when the behavioral limits are exceeded [Action], which part of the system should do it [Offload IP blocking], and how long it should be done [Quarantine time]
Tag(s) to attach to requests that are currently being quarantined
General parameters for administration [Name, Description]
A name for this Rule, to be used within the interface.
When this is enabled, this Rule will be applied within the scope defined by the Include and Exclude lists. Otherwise, it will not be enforced.
Information about this Rule, for use within the interface.
The entity that will be evaluated for this Dynamic Rule, and that will be quarantined if the Rule is violated.
For example, selecting IP means that each IP address in the traffic logs will have its requests counted separately, and if a violator is found, that IP will be quarantined. On the other hand, selecting ASN will combine all requests from all IPs within each ASN, and a violation will result in all IPs from that ASN being quarantined.
Some values for Target also require an associated value for Target key, e.g. the name of a specific header, cookie, etc.
As described above, admins can choose to block Dynamic Rule violators with Link11's Layer 3 protection. This option will be available when the planet is deployed on a Link11 private cloud, and an IP blocking action is selected.
When this option is enabled, and the change is published, it will apply to new violations of the Dynamic Rule. In other words, traffic sources currently in quarantine will continue being blocked by L11WAAP until the quarantine expires.
The number of permissible requests within the specified Time frame. Exceeding this number is a violation of the Rule and triggers the Action.
The period of time within which the Number of events is enforced.
The action to take when the Target exceeds the Number of events during the Time frame.
The period of time to keep the traffic source in quarantine, and execute the Action for its requests.
The tag(s) to include in the Global Filter that is constructed for this Dynamic Rule.
The Include and Exclude tag lists define the applicable scope of this Dynamic Rule. Their use is described on the UI Overview page.
Unlike Rate Limit Rules (which can be enforced against specific target URLs via Security Policies), Dynamic Rules are global by default.
However, they can still be limited to specific paths/targets by using a Global Filter to attach descriptive tag(s) to the appropriate requests, and then using the tag(s) in the Dynamic Rule's Include and Exclude lists.
Global Filters can be used to limit enforcement of a Dynamic Rule to certain types of requests (e.g., HTTP methods, non-static files, etc.).
For example, to enforce a Dynamic Rule only upon POST requests, a Global Filter could attach method-post to all incoming POST requests, and the Dynamic Rule would only Include method-post.
By using a cookie threshold, it is possible to quarantine hostile traffic originating from the same source, even if the attacker is changing IP addresses. This can be done by selecting a Target of cookie, with a Target key of waap_id (the cookie that L11WAAP sets for all traffic sources).

Features and conventions found throughout the user interface
The Link11 WAAP UI has several main parts:
In the left-hand sidebar, there is the console menu. By default, it is collapsed; it will slide out when clicked on, or the ">" button is selected.
The right-hand part of the window varies, depending on what the user has selected. If traffic analytics are not currently displayed, typically this will be a List page or an Editor page.
Most pages have common UI elements, described below.
Most pages have a section for .
These parts are described below, along with a discussion of how L11WAAP is configured and administered through the UI, and some common UI elements that are found throughout the interface.
This consists of the following sections:
Analytics
Security
Sites
System
The first section contains L11WAAP's reporting capabilities. The others are for configuring L11WAAP.
The configuration sections use a common structure for administration, with two types of pages:
List page: Displays all the entries for that configuration type.
Editor page: Provides the ability to edit a specific entry.
Most L11WAAP settings are collections of individual entries. The List page allows admins to manage these collections.
When a configuration type is selected in the sidebar menu (e.g., , shown above), its List page is shown. By default, it shows all the current entries for that configuration type.
The display can be filtered by selecting the funnel icon on the upper right. The list can be downloaded by selecting the download button next to the funnel.
To add a new entry, select the "+ New" button at the top right of the list.
After adding an entry, .
Deleting an entry can be done from the list of entries, or from the entry's Editor page.
From the list, hover the cursor over the entry, then select the trash icon that appears at the end of the entry.
From the Editor page, select the "Delete" button at the top.
You will be asked to confirm the deletion.
After deleting an entry, .
Hovering the cursor over an entry in the list will reveal an "edit" icon at the right end of the entry. Select this to open that entry in the appropriate Editor page.
Editor pages allow admins to manage individual entries within a collection of configuration settings.
Selecting the "<-" button on the upper left will navigate back to the .
Within an Editor page, the entry being displayed can be changed by selecting the pulldown list at the upper left. (The name shown for the currently-displayed entry is part of the pulldown list.)
After editing an entry, be sure to save your changes with the "Save" button at the top of the Editor page, and then .
To clone the entry being displayed, select the "Duplicate" button on the upper right.
To download the information in the entry being displayed, select the "Download" button on the upper right.
To delete the entry being displayed, select the "Delete" button on the upper right. As mentioned above, entries can also be deleted from the appropriate List page.
L11WAAP maintains versions for most of its configuration data. Admins can roll back or forward to a different version at any time.
Within the UI, most pages contain a Version History section at the bottom.
This section displays previous versions of configurations, and allows you to revert/restore the system to any saved configuration. By default, it is collapsed:
Expanding it reveals its contents:
To select a different version, hover the cursor over the end of the desired configuration's entry. A button will appear with an icon representing the "restore" operation.
Select this button. Once the process is complete, .
Throughout the interface, there are various lists and tables. Most of them have filter fields: text boxes at the top of each column, which will accept expressions to filter the displayed entries.
Here's an example of the Global Filters list, with crawler entered into the filter for the Name column:
As shown here, entering an expression will filter the results to display only matching entries, if any. Multiple filter fields can be used simultaneously; they will be combined with a logical AND.
Many settings include , as in this Security Policy example:
The dropdown list allows admins to add one or more . Below the list, the are displayed.
Administration and management of tags is described in detail here: .
The Editor pages for some types of security rules (, , and ) contain two lists labeled Include and Exclude.
By default, a security rule will be enforced for all incoming requests within its scope. The Include and Exclude lists can be used to limit the scope of this enforcement.
Each list can contain one or more tags:
If the Exclude list contains any tags, a request is exempted from enforcement if it matches the list.
If the Include list contains any tags, a request is exempted from enforcement unless it matches the list.
Rate Limit Rules and Dynamic Rules have or/and selectors for their Include and Exclude tag lists. These selectors become visible when more than one tag has been added to a list.
When a list is set to or, a request will match if it contains any of the tags in the list.
When a list is set to and, a request will match only if it contains all of the tags in the list.
Note that for any security rule, its two lists are separate, and can be set to different modes.
Flow Control Policy tag lists do not have or/and selectors. These lists operate in or mode; therefore, a request will match a list if it contains any of the tags in the list.
The Exclude list is evaluated before the Include list, and takes priority. See example below.
The Include list is not exhaustive. In other words, for the security rule to be enforced, all of the request's tags do not need to be listed in Include. However, if the Include list contains any tags, the request must have at least one (in OR mode) or all (in AND mode) of them, for it to be subjected to enforcement.
An empty Include list is treated as if it contains all. This is a system tag that all requests have. In other words, by default, the security rule will be enforced on every request (unless the request matches the
To add a tag to a list, select the "+" button. To remove a tag, hover the cursor over it and select the "x" that appears on it. To remove all tags, hover the cursor over the tag list and select the "X" that appears at the end of the list.
map security rulesets to paths within . The connections can be made within the Security Policies Editor.
These 'parent-to-child' relationships can also be configured within some of the Editor pages for the 'child' entities: , and .
The Connections to Security Policies list contains all of the paths within that use the child entity, and it allows admins to link the entity to additional Security Policies. In this context, a "connection" defines the scope within which the entity will be executed/enforced (assuming the entity is otherwise configured appropriately, e.g. the Rate Limit Rule is in Active mode).
Connections are created by adding entries to the list, confirming them by selecting the checkbox at the end of the entry, saving the changes, then publishing.
Admins can define individual connections, or multiple connections at once:
When Security Policies Name is set to a specific Security Policy, three options are available:
Match path creates one connection to the path(s) defined in the Path or Expression field. See note below about multiple path definitions.
Site Level creates a single connection to all paths within the site. This option is unavailable when an existing connection to this Policy contains a value in the Path or Expression field.
Add to all creates a separate connection for each path defined in the Security Policy. This is useful for Security Policies with a large number of paths; admins can automatically create multiple connections, then edit or delete the individual entries as needed.
When Security Policies Name is set to All Security Policies, Site level and Add to all function the same as described above, except that connections will be created for every Security Policy. Any unwanted connections can then be deleted.












Rate Limit Rules
The Rate Limit Rule(s) assigned to this path.
Edge functions
The Edge Function(s) assigned to this path.





It also contains an Action, which can be executed when the Filter's conditions are met.
For each request, Link11 WAAP will evaluate all active Global Filters. The request will receive tags from all Filters which match it.
After all Filters have been evaluated, L11WAAP will execute the highest-priority Action found in those Filters which matched the request.
There are two types of Global Filters:
System-managed, which are maintained by Link11.
Admin-managed, which are maintained by customer admins.
They vary in their visibility, alterability, and sources for Rule lists (i.e., the criteria for determining if a Filter should be applied to the request being analyzed).
These are provided and maintained by Link11. Most use external datafeeds as the sources of their Rule lists.
Datafeed-based Filters are updated regularly by Link11. Admins can also trigger an immediate refresh by selecting the Update now button on the Editor page.
Most system-managed Filters are visible to admins in the interface, with the ability to edit some of their parameters.
Depending on traffic conditions, some additional Filters might exist that are not visible to admins. Each active Dynamic Rule creates an internal Global Filter to enforce its restrictions. These are managed automatically by the system, and are mentioned here purely for informational purposes.
These are created and managed by admins. They are fully editable within the interface.
Typically, admins will manually create and manage their Rule lists, although these Filters can also be based on external data sources.
The administration of Global Filters follows the List/Editor UI conventions described here.
The main List page (shown above) lists all current Global Filters. The Editor page (discussed below) enables administration of individual entries.
Each Global Filter consists of:
Tag(s) to assign to requests that match the Rule list.
Rule list: The possible characteristics that a request could match (e.g., a list of IP addresses that it might originate from).
An Action that, if a match occurs, will be executed after all active Global Filters have been evaluated, unless a higher-priority Action overrides it.
General parameters for administrative purposes.
Each of these is described in depth below.
The discussion below will focus on admin-managed Filters. For system-managed Filters, the parameters that are editable will work the same as discussed below.
Name. A description that will be displayed within the L11WAAP interface.
Active. By default, this Global Filter will be evaluated for all incoming requests. To deactivate it, unselect this toggle.
Description: Information about this Filter, for use within the interface.
Source: For datafeed-based Global Filters, this contains the URL of the source. Otherwise, this field should be set to self-managed.
This field contains one or more user tags (separated by spaces) that will be assigned to all requests that fulfill the Rule list. Example: internal team-devops
The choices for this parameter are administered in the Actions page.
The Action that is selected here will be applied globally to all requests that match the Rule list.
The Rule list is generated in different ways, depending on the source of the data.
Many Global Filters obtain their Rules from an external source, specified by the URL in the Source field. Some are maintained by Link11; others can be created and maintained by admins.
System-managed Global Filters based on datafeeds are maintained automatically. Their underlying data sources are refreshed every 24 hours, and the Global Filters are updated automatically.
Admin-managed Global Filters based on datafeeds are initially created by entering the URL of the source file into the Source field, then selecting the Update now button that appears. L11WAAP will then populate the Rule list automatically. To refresh the Rule List, simply select the Update now button again.
Many Global Filters will be based on criteria that are not found in an external feed. In this situation, the Source field will say self-managed.
Typically, most admin-managed Filters will have this setting, with their Rule lists being created and maintained manually (described below). It is also possible for a system-managed Filter to have this Source setting.
When a new Global Filter is created, its Rule list will be empty, as shown above.
A Rule list contains one or more Sections. Each Section contains one or more Entries, where each Entry defines a match condition for evaluating requests. Sections can also contain one or more nested Sections.
When a Section contains multiple items (whether Entries or other Sections), its Section Relation button defines the logical condition (either AND or OR) to apply among those items.
Example: A Rule list contains two sections, with the overall Section Relation set to AND. The first section has criteria a, b, c and the second has i, j, k . Within each section, the Section Relation is set to OR. Thus, for a request x, the evaluation will be ((x==a) OR (x==b) OR (x==c)) AND ((x==i) OR (x==j) OR (x==k)).
To create a new Section, select the + New Section button. (If this button is not available, verify that the Source field is set to self-managed.)
To create an Entry within a Section, select the + New Entry button. The following dialog will appear:
For some of the criteria categories, the dialog will appear as it is above. Multiple entries can be made at once, with each entry on a separate line. Each line contains the value, plus a pound sign (#) followed by an optional individual annotation (a label for display within the L11WAAP interface). If individual annotations are not provided, then L11WAAP will assign the content of the Annotation field to each entry. Example:
For other categories, one entry can be made at a time. Annotations are defined in the Annotation field, and are not preceded by a pound sign.
The Match parameter will vary, depending on the chosen Category.
Argument
Name: exact match, case sensitive. Value: regex
ASN
Exact match for ASN number
Authority
Regex
Combination of the domain and (optional) port
Cookie
Name: exact match, case sensitive. Value: regex
Here are some sample entries for the various categories. (Note that when the Rule list is displayed like this, for criteria that consist of Name and Value fields, the system displays a colon between them. This colon is not included when entering the criteria.)
A Rule list for admin-managed Global Filters can be edited. Hover the cursor over the Entry that you wish to edit, and an "edit" button (a pencil icon) will appear. Select this button, and the Entry can be edited. After editing is complete, select the "confirm" button (a checkmark), then save the changes, and publish them.

Link11 WAAP provides the ability to log in using SSO (single sign-on). Configuration varies depending on the type of SSO: Okta, Microsoft, or Google.
Go to https://{YOUR ACCOUNT}-admin.okta.com/admin/apps/active
Click Add Application → Create New App
Choose Platform: Web, sign-in method OIDC (OAuth 2.0)
Sign-in redirect URIs:
https://<planet-name>.app.reblaze.io/auth/okta-oauth2-<planet-name>/authorization-code/callback
Federation Broker mode: disabled
In order to pass the Admin group ID, we need to add a custom attribute to the user groups.
Directory > Profile Editor > Apps > Click on Profile
Now map it:
Directory > Profile Editor > Apps > Click on Mappings
Assign group reblazeadmin to your app.
Copy the values for Client ID and a new client secret:
On the Reblaze SSO page (System -> SSO Configuration):
Fill in the requested values. For Issuer, use your Okta account. For IDP Group Claim, use the group you created above in Step 2.
Enterprise applicationsChoose + New Application → + Create your own application:
Select Integrate any other application you don't find in the gallery (Non-gallery)
Go to Single sign-on section and choose SAML:
Edit the Basic SAML Configuration:
Set Azure's Identifier (Entity ID) to <planet-name>.app.reblaze.io. Alternately, a unique identifier can be entered (e.g., customer_domain.com?sso=123), without any "https://" prefix. In either case, save a copy of this value somewhere; it will be needed again later.
Set Azure's Reply URL to https://<planet-name>.app.reblaze.io/auth/azure-saml2-<planet-name>/authorization-code/callback
Edit user.groups:
Click on +Add a group claim, and choose:
All groups
Source attribute: Group ID
Go to Azure Active Directory → Groups, and create a group.
And assign a user to the group:
From Azure's Single sign-on section, copy the Entity ID (entered during a previous step) and Login URL:
And from the Groups Overview section, copy the Object Id. This should be the same ID from Step 8.)
Add these parameters to the Reblaze SSO page. For Reblaze's IDP group claim, use Azure's Object Id.
Go to Google APIs & Services Credentials:
Click Create Credentials (shown below) -> OAuth client ID
For Application type, select Web application
Specify a Name for this client ID. (This name is only shown in the Google Cloud console.)
Define the domains and endpoints used by your planet to communicate with the OAuth 2.0 server:
Authorized JavaScript origins: https://<planet-name>.app.reblaze.io
Authorized redirect URIs: https://<planet-name>.app.reblaze.io/auth/google-oauth2-<planet-name>/authorization-code/callback
When you are done with the above steps, select Create. The new client ID will be created and displayed to you.
Copy the credentials (client id + client secret) for use in the following steps below.
Navigate to
In the APIs & Services menu, select Library
Search for "Admin SDK API", and select the result. The Admin SDK page will appear.
Select ENABLE if it isn't already enabled.
Navigate to
Select Security -> Settings
At the bottom of the page, select API access control
Select Domain wide delegation -> Manage domain wide delegation
Within the Reblaze console, go to the SSO page (System -> SSO Configuration).
Enabled: if not already "on", toggle it
SSO login name: choose a name for display within the console
Provider: select google
OAuth2 Client id: enter the client id obtained in Step 4
Every Reblaze user account has a role, with an Access Level that defines permissions. There are available, with varying capabilities.
When a user logs in via Google SSO, the system uses their Google Groups to determine which role they will have within Reblaze.
In this step, you will define (if necessary) and connect Google groups to Reblaze roles.
Determine how many roles are being used within your planet. (Some organizations will use all four, while others might not.)
Navigate to . Consider the Groups that currently exist; would any map well to a Reblaze role? For each role that does not currently have an appropriate Google Group, select Create Group and define one.
Return to the Reblaze SSO Configuration page. For each role being used, create a group map with:
An overview of traffic activity
The Dashboard page displays all incoming traffic and the actions executed in response to the different traffic events.
The user interface has three main sections:
Country
Exact match
Header
Name: exact match, case insensitive. Value: regex
IP Address
Exact match for IP, CIDR
Method
Regex
Organization
Regex
Example: the Organization for ASN AS15169 is Google LLC.
Path
Regex
Path Matching Name
Exact match
Query
Regex
Region
Regex
Security Policy Name
Exact match
Subregion
Regex
Tag
Exact match
URI
Regex
Path + query






In the API Client section, select Add New
In the Client Name field, enter the client ID from Step 4 above.
In the One or More API Scopes field, enter this: https://www.googleapis.com/auth/admin.directory.group.readonly
Select Authorize
OAuth2 Client secret: enter the client secret obtained in Step 4
Protocol: select oauth2
JWT token group property name: select email
The Reblaze role
SSO configuration within Reblaze is now complete. User management now consists of ensuring that each user is a member of the appropriate Google Group. For example: a Google Group has been created for [email protected], and within Reblaze, this email address is mapped to the role of Editor. Every user who should have Editor permissions can receive them merely by being added to the [email protected] Google Group.


























Note also that the Top Metrics section includes some tools for quickly building queries, often useful when investigating security events.
The controls at the top allow you to easily filter the display to show only the data you want. Initially, it asks you to supply a query.
Adding a query to the Search field and selecting the magnifying glass icon will display the results.
If the Search field is left empty, Link11 WAAP will display all results that match the selected Server Group (if any) and the parameters in the date/time selection field.
On the upper right, there is a dropdown list of Server Groups (which in most deployments, correspond to domains). Selecting one will add a filter parameter that will restrict query results to that Server Group. If no Server Group is selected, traffic data will be returned for all of them.
Server Group filtering can also be done manually, by entering a parameter and value (server_group="$SERVER_GROUP_NAME") into the Search field. The dropdown list will reflect this specification.
Selecting the "calendar" icon will display the date/time picker, for specifying the beginning and ending dates/times for the query.
When selecting times, hours and minutes are required, while seconds are optional. To specify seconds, simply click in the time selection box and type them, as shown in the "To" field below.
When seconds are not specified, the beginning of the specified minute will be used.
Queries consist of field names, operators, and arguments. Multiple filters can be combined (separating them with commas), and are evaluated with a logical AND. Some examples:
Show blocked requests: blocked=true
Show requests from the United States: country="United States"
Show requests with status codes in the 200s: status>199,status<=299
Show requests containing the string contentfilter in their reason for being blocked: reason~"contentfilter"
If you have constructed a query that you want to use for another purpose, select the "duplicate" icon next to the magnifying glass icon. A text string for the query will be copied to your clipboard.
To transfer the current query to the Events Log, simply select the "Open Events Log" button on the upper right. (Note that in order for the query to transfer, it must have been run already.)
The kebab (vertical three-dot) menu on the far right offers three options:
Filter Information: Links to a page in the user documentation describing syntax and best practices for constructing queries.
Query History: Shows the history of your queries in the current page (Dashboard or Events Log; separate histories are maintained for each). Each entry provides a Restore button, to restore that query to the Search field. Selecting the Search button will then re-run that query.
Apply Previous Query: Restores the previous query to the Search field. Selecting the Search button will then re-run that query.
Link11 WAAP reports data according to several categories, summarized here:
Hits
Total amount of requests
Passed
Requests that reached the upstream server.
Blocked
Requests that were blocked by L11WAAP.
Humans
Requests that passed L11WAAP's human vs. bot challenge process.
Bots
Requests with originators that were not (yet) verified as humans. For a full explanation, see .
Challenges
Requests that were served with bot detection challenges.
For a full explanation of these categories and their relationships to each other, see this page: Traffic Reporting and Analytics.
The charts display all data for the query's time period.
To adjust the time period shown in the charts, modify the query in the Search field or date/time control.
Hovering the cursor over a chart will display the values at that point on the graph.
You can filter the items being shown in a chart by selecting the data categories in the legend to enable/disable them.
This chart shows the traffic that was processed by L11WAAP: requests which passed through to the upstream servers, and requests that were blocked. Hits are distributed by time and sorted into three different categories: Humans, Challenges, and Blocked.
Counts the number of status codes in a certain time period.
HTTP Status response codes are divided into five categories:
1xx - Informational Response
2xx - Request Successful
3xx - Request for Redirection
4xx - Client Error
5xx - Server Error
For a detailed list of response codes, go here.
How many unique sessions and IP addresses were active at any given time.
Total bandwidth for all proxies.
The number of network requests during a certain period of time.
Bandwidth for the current proxy.
The time (in milliseconds) consumed by L11WAAP's processing.
The bottom part of the Dashboard displays traffic statistics according to a variety of "top" or "most frequent" metrics: the Top Applications, Top Countries, Top Targets, etc.
Each metric contains a list of entries. Where appropriate, entries representing blocked requests are shown in red.
In most of these lists, right-clicking on the entries will display a menu with options to copy the corresponding value to the clipboard, automatically rebuild the current query to show only (or exclude) that value, or show the Events Log with requests matching (or excluding) that value.
Most of the Top Metrics lists display their results according to the data categories described above (i.e., Hits, Humans, Bots, etc.)
Some of the lists include values for Down (the amount of traffic that originated from the upstream server towards the clients) and Up (the amount of traffic that originated from the client towards the upstream server).
Shows all protected sites for the current L11WAAP deployment.
Shows incoming traffic sorted by country. Each country's flag is shown by its name.
Shows traffic data according to IP address. The ASN (autonomous system number) is included where appropriate.
Shows the nature of user sessions. Sessions that pass L11WAAP's bot mitigation challenge are identified as originating from humans, and are listed here according to a user cookie containing RBZ in the cookie ID. Sessions that did not pass the challenge are shown with - for the ID.
Shows the URLs that were accessed the most frequently.
Shows the most common reasons why requests are being blocked or monitored during the time period.
Shows the referers that were extracted from the request headers.
Shows all the user agents that initiated requests for the application(s).
Shows all of the ASNs (Autonomous System Numbers) from which requests were sent. The ASN can identify individual entities, or larger networks: for example, a telecom provider or a cloud provider.
Shows a list of URIs, with the total latency for each.
Shows a list of URIs, with the latency for each from L11WAAP.
Shows a list of URIs, with the latency for each due to the upstream server.
When security incidents occur, the investigator will frequently submit a succession of queries, often starting from a broad scope and then drilling down into a narrower focus while trying to discern the underlying cause.
Link11 WAAP provides several tools in the Top Metrics section to make this process easier. The entries in each list can be right-clicked to display a popup menu, as shown below.
In this example, the admin is observing the Organizations list in the Top Metrics section, and has right-clicked on the top entry.
The options in the menu will do the following.
Copy value to clipboard: Copies the value of whatever was right-clicked to the clipboard. In the example above, this string would be copied: ASN4766 Korea Telecom.
Show matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will restrict the results to requests that match the field and value that was selected. In the example above, the following string would be added to the query: organization="ASN4766 Korea Telecom".
Hide matching: Adds a filter parameter (for whatever was right-clicked) to the existing query in the Search field at the top of the page. Submitting the modified query will exclude requests that match the field and value that was selected. In the example above, the following string would be added to the query: organization!="ASN4766 Korea Telecom".
Events Log (matching): The same as Show matching, except that it opens the Events Log with the modified query.
Events Log (other): The same as Hide matching, except that it opens the Events Log with the modified query.

Controlling the rates of incoming requests
There are many web threats that are built upon requests which otherwise might seem benign: credential stuffing, enumeration, payment card validation, coupon/gift code discovery, and more.
Rate limiting defends against these malicious activities by restricting the rates at which traffic sources can successfully submit requests. When a limit is exceeded, an action can be taken; for example, subsequent requests from that traffic source can be blocked for a defined period of time.
For more information, see the detailed discussion below of .
Filtering requests based on their content
Content Filtering is the final stage of traffic processing. This fulfills the role of a traditional WAF, which is to examine the content of a request for specific signatures and take specific actions when matches are found.
A Content Filter Profile associates signatures () with specific actions, and includes some other parameters as well.







A Rate Limit Rule can be enforced globally by enabling its Global mode setting. Otherwise, the Rule's scope will be defined by its Connections to Security Policies.
In both cases, enforcement is also subject to the Rule's Active mode setting and the constraints of its Include/Exclude filters.
The main page lists all current Rate Limit Rules.
The administration (addition/deletion/editing/versioning) of these Rules follows the conventions described here.
Each Rate Limit Rule consists of the following:
Settings to define the scope (the Global mode, Active mode, Include/Exclude lists, and Connections to Security Policies). These specify the requests upon which this Rule will be enforced.
A rate limit (defined by the combination of Time Frame, Count by / Event, Number of events, and Time frame).
Action(s) to perform when a violation occurs (Action, and Ban mode)
General parameters for administration.
These parameters are described below.
A name for this Rule, to be used within the Link11 WAAP interface. A system tag (shown below the Tags field) will include it as well.
When this setting is enabled, this Rate Limit Rule will be enforced globally (if the Global mode setting is enabled) or within the paths configured in all connected Security Policies, subject to the scope defined by the Include and Exclude lists. To deactivate the Rule, deselect this setting.
This can be helpful when a Rule is not performing as expected, and needs to be reconsidered. Rather than having to go find all the places where the Rule is being used, admins can simply deactivate it here, which will take effect across the entire platform.
When enabled, this Rule will be enforced globally, subject to the Active mode setting and the scope defined by the Include and Exclude lists.
Information about this Rule, for use within the interface.
These parameters tell the system how to count incoming events for rate limiting purposes. See "How rate limits are enforced," below.
The maximum allowable number of events within the Time frame.
The time period within which the Number of events limit is enforced, specified in seconds.
Frequently, an admin will want to constrain user activity within short periods of time (e.g., only allow three login attempts per minute). However, the optimal setting for Time frame will often be a much larger period of time. This is explained in more detail below: multi-tiered rate limiting.
An action to execute when the Number of events limit is exceeded within the Time frame. The available actions are defined on the Actions page. (Note that this can be, but doesn't need to be, a blocking action.)
Enables the blocking of a Rule violator for a longer time period than the Time frame. See discussion below: Banning traffic sources.
A list of one or more tags, separated by spaces. These will be attached to requests from traffic sources that have exceeded a rate limit.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.
By default, an active Rate Limit Rule will be enforced upon all requests globally (if the Global mode setting is enabled), or upon incoming requests targeting URLs to which this rule has been assigned via a Security Policy.
The Include and Exclude tag lists can be used to further constrain the enforcement of this Rule. Their use is described on the UI Overview page.
The list of Security Policies that include this Rate Limit Rule. Each Security Policy defines the paths within Backend Services for which the Rule will be applicable.
For a discussion of how to use this control, see Connections to Security Policies.
Above, Rate Limit Rules were described as if the system will count incoming requests, while monitoring the count to see if it has exceeded the Number of events. This is true sometimes, but not always.
A more accurate description is that a Rate Limit Rule counts events, as specified in the Event field. Frequently, this field will be set to HTTP request, which means that indeed, an internal counter will be incremented every time a request is received. However, there are more powerful ways to configure a Rule beyond this.
To illustrate how Rate Limit Rule parameters can be used, we'll discuss several examples. We'll start with simple use cases and finish with more complicated situations.
Example 1: Let's say an admin wants to define a rate limit as follows:
"Allow each unique IP address to send up to three requests to /login. If more than three requests are sent within one minute, block them."
To configure this, the following parameters would be set:
Time frame: 60 seconds
Count by: Attribute / IP Address
Event: HTTP request
Number of events: 3
...and then this Rate Limit Rule would be connected to a Security Policy that includes /login in its Path Mapping.
As shown in the example above, L11WAAP maintains an internal counter for every unique value of the Count by parameter(s).
In the example, a separate counter is maintained for each IP address that is sending traffic. When a request is received from an IP, that IP's counter is incremented, and the system checks to ensure that the counter's value hasn't exceeded the Number of events.
Each counter is reset to zero once the Time frame has passed (starting when the first request was received).
The Count by parameter can be multifactorial. In other words, admins can select "New Entry" and add additional Count by settings. When this is done, an internal counter is maintained for every unique combination of these settings.
Example 2: an admin configures the Count by section with two lines: Attribute / IP Address and Header / user_id. When the first request is received, an internal counter is created (set to a value of one) for this unique combination of IP and user_id. A second request is then received, originating from the same IP and from the same user; this causes the internal counter to be incremented up to two. A third request is then received from the same IP but with a different user_id; this causes a new internal counter to be created (and set to a value of one) for this combination.
Example 3: multiple Count by settings can be used to create site-level rate limiting. Let's say that there are three sites: www.example.com, api.example.com, and mobile.example.com. If the Count by section has Attribute / Session ID and Header / host, then the system will enforce separate rate limit counts for each site.
Example 4: an admin wants to rate limit the activity within each user session, regardless of the IP that is being used. For this purpose, the admin can set the Count by parameter to Attribute / Session ID.
Note that the composition of a Session ID might vary, according to context. Therefore, the system allows admins to define it within Security Policies, as explained here.
Each time a request is received, the system examines its destination's path to see which Security Policy applies. That Policy's definition of Session ID is used for any active Rate Limit Rules connected to it.
If a Rate Limit Rule is "Active" and "Global", but is not connected to a Security Policy, then the system will use the requestor's IP Address as the default Session ID for rate limiting purposes. In this situation, if actual session-based rate limiting is needed, then admins will need to specify the appropriate combination of headers, cookies, arguments, etc. manually in the Count by section.
As mentioned earlier, the rate limiting system does not directly count requests; instead, it counts events.
The four examples above have the Event field set to its default of HTTP request. This means that the receipt of a request is an event, and therefore, each request will cause an internal counter to be incremented.
Other Event settings are possible; admins can specify a header, cookie, argument, or attribute. When this is done, an internal counter is maintained for each Count by value, and incremented each time a new, previously unobserved Event value is encountered in a request.
Therefore, if an Event is defined as something other than HTTP request, the Rate Limit Rule constrains the number of allowable Event values for any given Count by value.
Example 5: Let's say we want to allow an individual user to login from a maximum of two ASNs within one hour. (Perhaps the user is accessing our web application from a coffee shop's WiFi, and then a few minutes later, leaves the coffee shop and begins using the cell network instead.) We want to allow this possibility; however, if we receive requests from the same user originating from three or more ASNs within an hour, we want to treat this traffic more suspiciously.
This is not possible merely by specifying two Count by conditions, as described above in the "Multiple Count by settings" section. If we set up two conditions (Argument / Username and Attribute / Organization) with a Number of events of 2, and assign it to our login form, then this will merely limit the number of times that the user can login from each ASN within an hour.
Instead, we set up one Count by condition (Argument / Username), and then set the Event to Attribute / Organization. Now the Number of events will apply to the number of Organizations that are observed for each specific Username.
Example 6: Your L11WAAP deployment includes some Rate Limit Rules out of the box. One of them might be a global Rule with settings similar to these:
Time frame 3600
Count by Cookie / waap_id
Event Attribute / IP Address
Number of events 5
L11WAAP sets a cookie (waap_id) for all users who interact with it. This can serve as a global identifier for users, across all domains, sites, applications, etc., even if individual sites/apps track users with different methods (whether user id, authentication tokens, and so on).
The example Rule shown above allows any particular user to have up to five IP addresses within an hour. When a sixth IP is encountered, it will execute the Action.
A common use case for Rate Limit Rules is the following:
Allow incoming requests until the Number of events has been reached.
Each subsequent request within the same Time frame will trigger the Action.
However, it is often necessary to create multiple tiers of Rate Limiting:
Allow the requests until the first Number of events is reached.
Each subsequent event will trigger the first tier's Action, until the second Number of events is reached.
Each subsequent event will trigger the second tier's Action, until the third Number of events is reached.
And so on.
For this purpose, multiple Rate Limit Rules can be created and set to be active within the same scope. This allows for increasingly restrictive actions to be taken as the number of events within the same Time frame increases.
Example 7: one possible use of multi-tier Rate Limits is to allow a certain amount of activity, and then verify that the user is human before allowing the activity to continue, while still enforcing reasonable boundaries. To do this, the Rules might look like this:
Number of events 3, Action monitor [tag only]
Number of events 7, Action challenge
Number of events 10, Action default blocking
The system would behave as follows:
The first three events would be allowed.
Events 4-7 would be allowed, but the requests would be tagged.
Event 8 would subject the user to a bot challenge. If the challenge is failed, subsequent requests would be blocked.
Events 9 and 10 would be allowed.
Subsequent events would be blocked.
Earlier, it was mentioned that the optimal Time frame for a Rate Limit Rule might be quite long. Multi-tier Rate Limits are the reason for this; the Time frame must be long enough to accommodate all of the previous tiers.
When its Time frame expires, a rate limit will reset, and its internal counter will be set to zero.
This means that the rate limiting described above cannot, on its own, fully defeat persistent attackers.
To accomplish this, L11WAAP provides two capabilities: Ban mode, and Dynamic Rules.
Both allow admins to define granular Rate Limit Rules with short time frames and maintain precise control of various situations, while still being able to block persistent violators for much longer periods of time.
When Ban mode is enabled, the Ban duration field appears. These two values allow admins to configure a longer-term blocking action for rate limit violators.
When a Rate Limit Rule is violated (i.e., an event occurs that exceeds the Number of Events), and Ban mode is enabled, the offending traffic source is banned immediately.
Beginning with the request that triggered the ban, L11WAAP will reject all activity from the offending traffic source, for the length of time specified in Ban duration.
A Dynamic Rule is similar to a Rate Limit Rule with Ban mode enabled. It too defines an allowable threshold of events that can occur within a certain period of time. If that threshold is violated, an action occurs.
However, there are some important differences:
When configuring a Dynamic Rule, an admin can choose to block violators, but can also choose a non-blocking Action.
If blocking is selected, the blocking can be offloaded to Link11's Layer 3 protection.
Dynamic Rules are enforced globally, unless their scope is otherwise constrained.
Violators of a Dynamic Rule will appear in the Quarantined list. Admins can manually remove them from this list (which ends the quarantine early) if desired.
When a Dynamic Rule is violated, a can be sent.

A Content Filter Profile is assigned to paths/URLs within applications and APIs via Security Policies.
When a request is received, the system checks its destination URL, and uses the Profile that best matches it.
Out of the box, the system includes a default Content Filter Profile. It can be edited, but it cannot be deleted. It is used for all URLs where no other Profile has been assigned.
The main page lists all current Content Filter Profiles.
The administration (addition/deletion/editing/versioning) of Profiles follows the conventions described here.
Content filtering is a multi-step process:
Data Masking: sensitive data in the request is masked, so that it does not appear in traffic logs.
Content Type Checking: if one or more Restrict content type settings are enabled, they are enforced.
Allowlisting: if the request has one or more specified tags in the Ignore list, it is exempted from further processing.
Content Filtering: several forms of content limits are checked. The request's parameters (headers, cookies, and arguments) are then examined. Tags are added to the request based on .
Tag Evaluation: the request's tags are evaluated for reporting and/or action purposes.
Each step is described in more detail below. For context, here is a graphic showing the controls/sections within the UI that are used in each step:
And here is a flowchart of the process described below, with captions along the top representing the relevant steps:
For parameters listed in the Parameter Properties list with the Mask? option enabled, their values are replaced by hashes of these values with the Masking seed.
If the Ignore Body setting is not enabled, and one or more Restrict content type settings are enabled, the request is evaluated against them. If the request cannot be parsed according to one of the specified types, the Action will be executed.
Before content filtering is performed, the tags that are already attached to the request are evaluated. (These tags could be the result of Global Filters, Rate Limit Rules, or Flow Control Policies.)
If any tag is found in the Ignore list, the request is not subjected to content filtering (i.e., Step 4 and Step 5 below do not occur). This allows certain requests to be allowlisted (for example, if they are from a trusted source), avoiding the overhead of unnecessary processing.
Starting with the headers, each parameter (each header, cookie, and arg) of the request is processed. Each parameter and its value are compared to the entries in the Parameter Properties list: the entries in its All section and also the relevant parameter-type section (either Headers, Cookies, or Arguments).
The Parameter Properties list allows the following to be defined:
The parameters, if any, whose values should be masked.
The parameters, if any, whose values should be restricted to regex definitions.
The parameters, if any, which should be exempted from evaluation against specific Content Filter Rules.
For each parameter, the processing occurs in the order described below, until one of the following happens:
the parameter is exempted from further inspection
the Action is triggered (which also terminates the processing of the request)
the parameter completes its processing
At that point, the next parameter is processed, until none remain.
Parameter processing in detail
The relevant Max Count limit is checked (excluding decoded content). If it is active and the parameter exceeds the limit, the Action is triggered.
The relevant Max Length limit is checked (excluding decoded content). If it is active and the parameter exceeds the limit, the Action is triggered.
If the Ignore Alphanumeric input option is enabled, and all the parameter's content is alphanumeric, this parameter is exempted from further inspection.
If one or more entries have a definition for Parameter that matches the parameter's name, the entry that most closely matches it is selected. If an entry was selected, and the parameter's value does not match the entry's Matching Value, and the entry's Restrict? option is enabled, the Action is triggered.
The parameter is evaluated against the . Link11 WAAP iterates through the Rules, and for each one:
If the parameter matched an entry (in both Parameter and Matching Value), and any of the Rule's tags are listed in the entry's Ignore Content Filter Tags, this Rule is skipped and its tag(s) are not attached.
Otherwise, the Rule's Match string is compared to the parameter's value. If a match is found, the Rule's tags are attached to the request.
This parameter has now completed its processing, and the next parameter in the request is selected.
All the request's tags, including the list of new tags accumulated in the previous step from Content Filter Rule evaluation, are now compared to the Report and Active tag lists.
During this process, a request's tags are divided into two categories:
Specific tags produced by individual rules (and designated with the Rule name: cf-rule-id-XXX)
General tags (cf-all and all other tags that are not specific)
Specific tags are processed first. This allows admins to set up general configurations for threat categories, while still being able to make exceptions for how specific Content Filter Rules are handled.
The request's list of tags are processed as follows:
All specific tags are compared to the Report list. For each tag that is found there, the relevant Content Filter Rule name will be added to the Events Log's Monitor reason field for the request.
All general tags are compared to the Report list. For each tag that is found there, the relevant Content Filter Rule name will be added to the Events Log's Monitor reason field for the request.
If any of the specific tags are found in the Active list, the Action is executed, and processing ceases.
If any of the general tags are found in the Active list, the Action is executed, and processing ceases.
An entry in Ignore always "wins". It is dangerous to put anything other than specific tags into it.
Content Filter Profiles can be used as part of a positive security model (where by default, all requests are rejected, except for those identified as being legitimate).
This can be done by ensuring that each parameter (header, argument, or cookie) that could appear within a request is listed in the Parameter Properties list, with an appropriate Matching Value, and with the Restrict? option enabled.
As described above, during processing, each parameter in the incoming request will be evaluated according to the applicable Matching Value.
If it matches, this parameter will pass the test.
If it does not match, the Restrict? setting will cause the Action to be executed.
A Content Filter Profile consists of the following:
Settings for parsing the request (Restrict content type, Decoding, Ignore Alphanumeric Input, Ignore Body)
Settings for processing the request (Action, Tags)
Content filtering parameters (the bottom section of the UI, referred to below as the Parameter Properties section)
Parameters for (the Ignore list) and (Active and Report lists)
Masking parameters for concealing sensitive information in logs and analytics (Masking seed, and Mask? setting for individual parameters)
General administration parameters (Name, Description)
In this context, "global" means "applying to the entire request."
A name for this Profile, to be used within the interface. A system tag (shown below the Tags field) will include it as well.
Information about this Profile, for use within the interface.
An admin-defined string for salting the hash when masking private data. See discussion of the Mask? field, below.
The action that can be executed under the various circumstances described above in The Content Filtering Process.
A list of one or more tags, separated by spaces. Whenever this Content Filter Profile is applied to a request, these tags will appear in the traffic logs.
In addition to these admin-defined tags, the system also shows some system tags that will be attached as well.
When this is selected, this Content Filter Profile will not inspect requests that only contain alphanumeric characters. This reduces computational overhead by not evaluating alphanumeric requests. (Hostile requests such as SQLi, XSS, etc., will contain some non-alphanumeric characters.)
When this is selected, this Content Filter Profile will not inspect the body of the request.
If Ignore Body is not selected, and one or more Content Types are checked, L11WAAP will expect the request to conform to one of them. If the body cannot be parsed according to one of the specified types, the Action will be executed. If no Types are checked, no restrictions are enforced.
Which decoding standard(s) should be used.
This section defines what happens to a request, depending on its tags.
This list is evaluated before content filtering occurs, as described above in Step 3.
These lists are evaluated after content filtering rules have been evaluated. See the description above of Step 5.
If a potential tag is not included in the Active or Report lists, it is effectively in Ignore mode. That tag cannot result in the request being blocked, regardless of the severity of the threat signature (i.e., the Content Filter Rule) that produced the tag.
Along with ensuring that all potential tags are properly configured, it is also recommended that each Content Filter Rule has an appropriate Risk Level defined, and that each Content Filter Profile has the highest risk-level tags (e.g., cf-rule-risk:5, cf-rule-id:libinjection-sqli, andcf-rule-id:libinjection-xss) included in the Active mode. This ensures that the highest-risk requests will still be blocked.
This is the bottom section of the interface. It defines how L11WAAP processes individual parameters within a request.
The maximum allowable length of the value for this parameter type (header, cookie, or arg).
When enabled, Max length is enforced.
The maximum allowable number of this parameter type (headers, cookies, or args).
When enabled, Max count is enforced.
The parameter whose value will be compared to the Matching Value. This can be provided as a specific Name (e.g., sessionid), or as a Regex to match multiple parameters (e.g., user_.+). Note that a Name will be marked with ABC, while a Regex will be marked with <>.
A regex pattern. If a parameter's value matches it, the Ignore Content Filter Tags become relevant. If it does not match, the Restrict? option becomes relevant.
If a parameter does not match the Matching Value, and Restrict? is selected, then the Action is executed.
Some requests might contain private data which should not be saved to a traffic log. Parameters which match the Matching Value and for which Mask? is set will be masked / hashed when they are written to the logs, salted with the Matching Seed from the global settings.
A parameter whose value matches its Matching Value, or which does not match but Restrict? is not enabled, will be evaluated against the Content Filter Rules. For each Rule that it matches, that Rule's tags will be attached. Sometimes it is desirable to exempt a parameter from the effects of certain Rules. For example, some Rules filter out special characters; if a parameter can legitimately contain these characters, it would make sense to exempt that parameter from those specific filters. To do this, add the tags from those Rules to this list. These tags will then be ignored for this parameter.

Link11 WAAP acts as a reverse proxy; it receives requests from clients (web visitors, API clients, etc.), blocks hostile traffic, and passes legitimate requests to the backend.
Proxy Templates define L11WAAP's behavior as a proxy. They are templates for creating new sites (i.e., ) within Link11 WAAP.




When new sites are created, they remain linked to their underlying templates. Revising a Proxy Template will automatically update all sites that are based upon it.
A Proxy Template consists of the following:
General parameters for administration
Frontend settings, defining L11WAAP's interaction with clients
Backend settings, defining L11WAAP's interaction with backend servers
Trusted Sources, defining trusted sources of traffic (e.g., load balancers and CDNs)
Advanced Configuration, defining additional customization
A name to be used within the interface.
Information about this Template, to be used within the interface.
Defines one or more header fields within which L11WAAP can find the client's IP address. When the system receives an incoming request from a client, the request will have passed through a load balancer on its way to L11WAAP. This means that the header will contain the client's IP and the load-balancer IP. These two IPs are usually found within the X-Forwarded-For field (which is the default entry here). In this situation, L11WAAP knows how to extract the client IP from this field. In other situations, a different field name might be necessary. For example, if the customer is using Akamai CDN, the incoming request will have the client IP in a field named True-Client-IP instead.
You can place limits on the amount of data that users can upload to the system. The defaults usually work well; however, if your application accepts user-generated content or other large files, then changes to these settings might be necessary.
Specifies the maximum accepted body size of a client request, as indicated by the request header Content-Length. Size in MBs.
These settings allow you to limit the amount of resources consumed by an IP address. The system can limit consumption by the average number of requests per second, while also allowing temporary bursts at a higher rate.
When a requestor exceeds any of these thresholds, subsequent requests will be answered with error code 503 (Service Unavailable).
Sets the allowable request rate per IP, per second: i.e., the allowable per-second average of incoming requests, enforced on an incremental basis (where "increment" refers to the number of milliseconds allowed for one request).
Example: This is set to 100. Thus, 100 requests are allowed per second. However, the system does not enforce rate limits on a per-second basis; it used a granularity of milliseconds. Therefore, it will allow one request every 10 milliseconds. (100 r/s, divided by 1000 ms/s, equals 1r/10ms.)
Sets the allowable additional burst rate per IP, per second. The additional requests are accepted and placed into a queue.
Example: Let's say that the previous field (Requests per second per IP address) is set to 100. Without burst limits—i.e., if this field were set to zero—the system will reject every request that was received less than 10ms after the previous one. However, the burst limit is set to 20 instead. This means that L11WAAP will accept 21 requests (1 original plus 20 additional) per 10 milliseconds. In other words, when a request is received, up to 20 more can be received and accepted within the following 10 ms. If instead 25 total requests are received during that time, the last four requests will be denied with a 503 error.
The Timeout settings allow the system to monitor the time required to serve resources to each client. Any connection that exceeds the specific limits will be dropped.
The Timeout settings allow L11WAAP to block unresponsive requestors, whether their unresponsiveness is malicious or not. For most deployments, the default timeout settings work well. They are sufficient to filter out hostile traffic, while still accommodating even those users with low bandwidth.
All times are specified in seconds.
If the body is not obtained in one read-step, this timeout begins. If the timeout expires and the client has still sent nothing, the L11WAAP Gateway returns error Request time out (408).
The timeout for keep-alive connections with the client. The L11WAAP Gateway will close connections after this time. This setting increases server efficiency; it allows the server to re-use browser connections and save resources. When changing this value, special care should be taken; in some cases, it depends on specific cloud vendor and load balancer settings.
How long to wait for the client to send a request header. If the header is not received within this time, L11WAAP returns error 408 (Request Timeout).
Specifies the response timeout to the client. This timeout does not apply to the entire transfer but, rather, only between two subsequent client-read operations. Thus, if the client has not read any data for this amount of time, the L11WAAP Gateway shuts down the connection.
The maximum buffer size for accepting client request headers.
The default buffer size for accepting client request headers.
The maximum number of buffers for accepting client request headers.
The maximum buffer size for accepting the client body.
The time (in seconds) for L11WAAP to wait, before treating a connection with the backend as having failed.
The time (in seconds) for L11WAAP to wait, before treating a data transfer attempt to the backend as having failed.
The time (in seconds) for L11WAAP to wait, before treating a downstream (toward Link11) data transfer attempt as having failed.
Defines the value of the Host header passed to the backend. The default value ($host) sets it equal to the Host header in the incoming request (in other words, the Host header is passed upstream unchanged).
Defines the field name that contains the client's IP address. L11WAAP is a proxy, and it passes incoming client requests to the upstream server. This means that the server will receive request headers which contain L11WAAP's cloud IP address as the "client" IP. Usually, this is not useful; almost always, the server will need the IP of the actual client instead. To facilitate server logging, analytics, and so on, L11WAAP adds the IP address of the originating client to the headers that it sends to the server. The Real IP Header Name defines the name of the field within which this information is passed.
This list defines the ranges of IP addresses which are trusted for providing forwarded IPs: for example, the load balancers in front of L11WAAP, or a CDN.
Each entry in the list can be specified as either:
A range of IPs
The name of a Global Filter. The Trusted Sources list will link to that Filter, and include its list of IPs; whenever the Filter's IPs are updated, the Trusted Sources list will be dynamically updated as well.
Selecting the + New button will display a new entry for editing. Multiple entries can be added.
For each entry, fill in the Source field to specify the type (IP Address or Global Filter), and the Source value (the IP range or Global Filter name). The Comment field is optional.
Internally, L11WAAP uses Nginx. A Proxy Template contains a number of commonly-used settings that define Nginx's parameters and behavior. However, there are many other possible configuration changes that an admin might want to make.
The Advanced Configuration section allows admins to define custom code for this purpose.
Nginx uses configuration files to define its settings. When a Link11 WAAP admin adds Custom Configuration Code to a Proxy Template, and then publishes the changes, this code is inserted into an individual per-site configuration file. (In other words, each server group can have its own code.) It is then imported into the main nginx.conf file.
During this process, nginx.conf's other contents are not overwritten. L11WAAP extends this file with its various per-site settings.
Be extremely cautious when using the capability. The system will perform some basic validation on custom code (for syntax and so on), but this is not exhaustive; therefore, admins are ultimately responsible to ensure that the code is correct. If incorrect code is executed, this can result in unpredictable system behavior.
Some examples are below.
A name to be used within the interface.
A description to be used within the interface.
Requests with this protocol will trigger the execution of the Custom Configuration Code.
The code which will be executed when requests have the specified Protocol.
In the examples below, there are sections of code delimited by -----BEGIN SERVER----- / -----END SERVER-----. and -----BEGIN LOCATION----- / -----END LOCATION-----. These delimiters are not included in the final file; they merely tell L11WAAP where to insert the code.
Code inside the SERVER delimiters will be placed into a server {} block. (This code can include one or more nginx location {} blocks.)
Code inside the LOCATION delimiters will be placed within a location / {} block for the specific server group.
Code without any delimiters will be placed into the server {} block.
Below are some examples.
This snippet configures SSL client certificate authentication on the Nginx server, requiring clients to present valid certificates. The server uses the certificate authority file at /etc/zzzz-client-cert-mydomain.crt to validate the client's certificate, allowing up to 3 levels of intermediate certificates in the validation chain. There are no specific configurations for any URL locations.
Here is a detailed explanation.
Specifies the path to the client certificate authority (CA) file. This file contains the trusted CA certificates (in this case, zzzz-client-cert-mydomain.crt) that are used to verify the client's SSL certificate.
This turns on SSL client verification, meaning the server will require and verify client certificates. Any client trying to connect to this server must present a valid SSL certificate signed by a trusted authority specified in the ssl_client_certificate file.
Defines the maximum verification depth for the client certificate chain, meaning that Nginx will verify up to 3 levels of intermediate certificates. This ensures that the certificate chain presented by the client is valid up to the root certificate authority.
This section is empty, indicating that no specific configurations are defined for any particular location in this part of the file. However, in the broader context of Nginx configurations, this would be where you define behavior for specific paths or endpoints on the server, such as /api or /login.
By default, Let's Encrypt is supported only on port 80 (the http protocol). If for some reason the request is received over HTTPS (note that on Cloudfront there is a redirect from HTTP to HTTPS), it needs to be allowed. The code above adds validation on HTTPS.
This configuration proxies requests for a certain location (the root) to an upstream server, handling WebSocket connections and forwarding various headers like real client IP and protocol. Lua scripting is used to inject custom logic during the request and response phases, and the caching status of the upstream is also added to the response headers.
Configures Nginx to use HTTP/1.1 when communicating with the upstream server.
Passes the request to the upstream server, which is dynamically defined by the $active_upstream variable.
Sets the Upgrade header to the value of $http_upgrade, typically used for WebSocket connections or other HTTP protocol upgrades.
Sets the Connection header to the value of $connection_upgrade. This also relates to keeping WebSocket or other persistent connections alive.
Modifies the Host header that is passed to the upstream server to include the requested host and port.
Adds a header to pass the client’s real IP address (from $remote_addr).
Sets the X-Forwarded-For header, which includes the original IP address of the client, useful for tracking traffic through multiple proxies.
Sets the protocol used for the request (HTTP or HTTPS) in the X-Forwarded-Proto header.
Ensures that the request headers are forwarded to the upstream server.
Lua blocks now customize how requests and responses are processed. First, a script is run at the access phase of the request. This script requires a Lua module called hooks and calls the trigger_access() function. This can be used to run custom logic like authentication, logging, or modifying requests.
Next, a Lua script is run during the header filter phase (typically after the response headers are received from the upstream server but before they are sent to the client). The trigger_header() function can modify or inspect response headers.
Adds a custom header (X-Cache-Status) to the response, reflecting the caching status of the upstream server.
This Nginx configuration block handles requests for the path /public/notification, forwarding them to an upstream HTTPS server. Lua scripts are used to log profiling data for request and response processing times. Caching is disabled, and the response is sent directly without buffering. The use of session handling (session.process_request()) suggests some form of user/session validation or similar logic.
Specifies that this block handles requests to the exact URL /public/notification.
Begins Lua scripting for request handling.
Loads a Lua module named "session". This module is likely responsible for session management or processing the request in some way.
Loads a Lua module called metadict, likely for logging or profiling purposes.
Gets a function metadict_set from the metadict module to set profiling data.
Logs the start of request processing by calling metadict_set with the current timestamp (ngx.now()), storing it under the key 'rbz_start_req_proc' in a "profiler".
Calls a function process_request() from the session module, which processes the request, likely dealing with authentication, session validation, etc.
Logs the end of the request processing by calling metadict_set again, marking the completion of the request with the timestamp.
Next, there is Lua scripting for response handling.
This block runs after the upstream server responds but before the response is sent to the client.
Loads the metadict module again.
Retrieves the metadict_set function.
Logs the start of the response phase by setting a timestamp for the key 'rbz_start_response' in the "profiler".
Instructs Nginx to bypass any caching mechanism for this specific request, meaning the response will not be served from cache.
Ensures that the response is not stored in the cache for future requests.
Adds a custom response header (X-Cache-Status) that contains the upstream cache status, indicating whether caching was used for this request.
Disables proxy buffering for this location, meaning that Nginx will not buffer the response and will immediately send it to the client as it receives it from the upstream server.
Forwards the request to the specified upstream server at https://mydomain_ssl. This could be a load balancer or an actual backend server, and it's handling the secure HTTPS protocol.

-----BEGIN SERVER-----
ssl_client_certificate /etc/zzzz-client-cert-mydomain.crt;
ssl_verify_client on;
ssl_verify_depth 3;
-----END SERVER-----
-----BEGIN LOCATION-----
-----END LOCATION-----
ssl_client_certificate /etc/zzzz-client-cert-mydomain.crt;ssl_verify_client on;ssl_verify_depth 3;-----BEGIN LOCATION-----
-----END LOCATION----------BEGIN SERVER-----
location ^~ /.well-known/acme-challenge/ {
proxy_set_header rbz-letsencrypt 931f5de197188ad0ab3e2de3efeb4d60b15767dff448fbd0;
proxy_set_header Host myplanet.app.reblaze.io;
proxy_pass https://myplanet.app.reblaze.io;
add_header Cache-Control "max-age=0, no-cache, no-store";
add_header expires "Thu, 01 Jan 1970 00:00:01 GMT";
add_header Pragma no-cache;
}
-----END SERVER-----
-----BEGIN LOCATION-----
-----END LOCATION-----
location / {
proxy_http_version 1.1;
proxy_pass $active_upstream;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass_request_headers on;
access_by_lua_block {
local hooks = require "hooks"
hooks.trigger_access()
}
header_filter_by_lua_block {
local hooks = require "hooks"
hooks.trigger_header()
}
add_header X-Cache-Status $upstream_cache_status;
}proxy_http_version 1.1;proxy_pass $active_upstream;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_set_header Host $host:$proxy_port;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass_request_headers on;access_by_lua_block {
local hooks = require "hooks"
hooks.trigger_access()
}header_filter_by_lua_block {
local hooks = require "hooks"
hooks.trigger_header()
}add_header X-Cache-Status $upstream_cache_status;location = /public/notification {
access_by_lua_block {
local session = require "session"
local metadict = require "metadict"
local metadict_set = metadict.metadict_set
metadict_set("profiler", ngx.now(), 'rbz_start_req_proc')
session.process_request()
metadict_set("profiler", ngx.now(), 'rbz_done_req_proc')
}
header_filter_by_lua_block {
local metadict = require "metadict"
local metadict_set = metadict.metadict_set
metadict_set("profiler", ngx.now(), 'rbz_start_response')
}
proxy_cache_bypass 1;
proxy_no_cache 1;
add_header X-Cache-Status $upstream_cache_status;
proxy_buffering off;
proxy_pass https://mydomain_ssl;
}location = /public/notification {access_by_lua_block { local session = require "session"local metadict = require "metadict"local metadict_set = metadict.metadict_setmetadict_set("profiler", ngx.now(), 'rbz_start_req_proc')session.process_request()metadict_set("profiler", ngx.now(), 'rbz_done_req_proc')header_filter_by_lua_block {local metadict = require "metadict"local metadict_set = metadict.metadict_setmetadict_set("profiler", ngx.now(), 'rbz_start_response')proxy_cache_bypass 1;proxy_no_cache 1;add_header X-Cache-Status $upstream_cache_status;proxy_buffering off;proxy_pass https://mydomain_ssl;
Add a certificate to a Load Balancer
An enumeration.
falsetrueSuccessfully added certificate to Load Balancer
No content
Validation Error
Internal Server Error
No content
Detach a non-default certificate from the Load Balancer
trueSuccessfully detached certificate from Load Balancer
No content
Validation Error
Internal Server Error
No content
Get regions with available datacenters for each Load Balancer.
Load Balancers retrieved successfully
Input Error
Internal Server Error
Set preferred datacenters for each Load Balancer. "automatic" will choose the best route depending on the load balancer location.
[{"id":"<id>","regions":{"ash":"ffm","ffm":"ffm","hkg":"ffm","lax":"ffm","lon":"ffm","sgp":"ffm","stl":"automatic"}}]Load Balancers retrieved successfully
Input Error
Internal Server Error
{
"message": "Successfully set Load Balancer regions"
}GET /api/v4.3/conf/{config}/load-balancers HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"certificates": [
"text"
],
"default_certificate": "text",
"dns_name": "text",
"listener_name": "text",
"listener_port": 1,
"load_balancer_type": "classic",
"max_certificates": 1,
"name": "text",
"provider": "aws",
"region": "text"
}
]
}PUT /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates/{certificate_id}?provider=aws®ion=text&listener=text&listener-port=1 HTTP/1.1
Host:
Accept: */*
DELETE /api/v4.3/conf/{config}/load-balancers/{entry_name}/certificates?provider=text®ion=text HTTP/1.1
Host:
Accept: */*
GET /api/v4.3/conf/{config}/load-balancers/regions HTTP/1.1
Host:
Accept: */*
{
"city_codes": "{\"ams\":\"Amsterdam\",\"ash\":\"Ashburn\",\"ffm\":\"Frankfurt\",\"hkg\":\"Hong Kong\",\"lax\":\"Los Angeles\",\"lon\":\"London\",\"sgp\":\"Singapore\",\"stl\":\"Saint Louis\"}\n",
"lbs": "[{\"id\":\"<id>\",\"name\":\"<name>\",\"regions\":{\"ams\":\"automatic\",\"ash\":\"automatic\",\"ffm\":\"automatic\",\"hkg\":\"automatic\",\"lax\":\"automatic\",\"lon\":\"automatic\",\"sgp\":\"automatic\",\"stl\":\"automatic\"},\"upstream_regions\":[\"ffm\",\"lax\"]}]\n"
}POST /api/v4.3/conf/{config}/load-balancers/regions HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 163
{
"lbs": "[{\"id\":\"<id>\",\"regions\":{\"ash\":\"ffm\",\"ffm\":\"ffm\",\"hkg\":\"ffm\",\"lax\":\"ffm\",\"lon\":\"ffm\",\"sgp\":\"ffm\",\"stl\":\"automatic\"}}]\n"
}The page below describes how to retrieve traffic data via the API. It contains these main sections:
The filters parameter (which specifies the traffic data that will be retrieved)
The four API routes that retrieve traffic data, and how to use them
The provides access to traffic data, via these four routes:
GET /api/v4.0/data/topx
GET /api/v4.0/data/stats
GET /api/v4.0/data/timeline
GET /api/v4.0/data/logs
Each includes an input parameter named filters. This parameter specifies the traffic data that will be retrieved.
Below, we begin by discussing this parameter's usage, syntax, and construction. Then we discuss the four API routes that require it, and the different types of data they return.
filters is a string that specifies one or more conditions. A database query is constructed from those conditions, and the results are returned to the user.
Usage of the filters parameter depends on the context:
When using Swagger UI, this value is supplied directly in the filters input field.
When using curl to call the Link11 WAAP API, this value is encoded into the destination URL, preceded by "filters=". See for more information.
Here is an example of a filters specification in JSON format:
This will return requests which:
were received in a five-minute time period (from 2024-06-06 09:31:00 to 2024-06-06 09:36:00), and...
have a containing the string unrecognized . (In this example, the admin wanted to retrieve requests tagged with unrecognized-host-header.)
The filters parameter can be supplied as a query string, or as JSON.
This format is used in the first input field in the UI's and . For example, this query string will display all requests with a 301 response code within a certain time period:
status=301, timestamp between 2024-06-06 09:31:00 and 2024-06-06 09:36:00
For more information on this format, see .
The JSON equivalent of the query string above is:
(This is provided as an example only. A full discussion of JSON syntax is below.)
The POST /api/v4.0/data/timeline/parse API route accepts query strings and returns the same query in JSON format.
A JSON filters parameter is structured as follows:
The first condition must be included, and must be a range of dates/times. It is structured as follows:
where $TIMESTAMP1 and $TIMESTAMP2 are timestamps: specifications of date and time.
For timestamps, any ISO format is supported. Nevertheless, both timestamps must include year, month, and day.
If hours, minutes, or seconds are not included in a timestamp, the time will be rendered as the beginning of the day/hour/minute, respectively. Examples: "2022-07-14" -> "2022-07-14 00:00:00", "2022-07-14 06:52" -> "2022-07-14 06:52:00", etc.
After the first condition, additional conditions can be specified if desired. They are structured as follows:
They must meet these requirements:
Multiple conditions are combined with a logical AND. (A logical OR is not supported, as this could potentially retrieve unexpectedly large amounts of data.)
When multiple conditions are provided, all are followed by commas, except for the final one.
The "key" line is optional; see discussion .
Available fields include those inherent to HTTP requests, along with additional data added by L11WAAP during processing.
Some of the added information consists of internal IDs for the security settings that are relevant to the request.
Some requests will not contain all possible information. When L11WAAP blocks a request, processing usually stops immediately, and later stages in the do not occur.
For some types of data, it might not be enough to specify the field, because there could be multiple parameters in the request that match it. For example, a field name of "cookies" or "headers" does not tell the system which cookie or header to inspect.
The key field supplies this information; it is the name of the specific parameter to evaluate. If this parameter is not defined, the system will inspect all instances of the specified field (all cookies, all headers, etc.).
Some examples are in the below.
Values should be specified in the appropriate data type: strings as quote-delimited strings, integers as numbers, etc. Arrays of values can be supplied.
Operators can be inverted by adding not. For example, not eq means "does not equal".
It's possible to invert an entire condition by adding NOT, like this:
Retrieve PUT and POST requests:
Retrieve requests containing a tag that matches "geo" or "location":
Retrieve requests where certain cookies' values match a regex:
Retrieve requests where any cookie's value matches a regex:
Retrieve requests according to a subfield (the acl_active subfield of security_config must be greater than 11).
Retrieve requests according to an array of subfields:
Retrieve requests according to a combination of conditions (there is no limit on the number of conditions):
As noted previously, there are four API routes that use the filters parameter to retrieve traffic data:
GET /api/v4.0/data/topx
GET /api/v4.0/data/stats
GET /api/v4.0/data/timeline
GET /api/v4.0/data/logs
Their typical uses are as follows.
Quickly discover the most important factors in the traffic stream (e.g., the countries sending the most blocked requests, the URLs receiving the most bot traffic, etc.): use the topx route.
Get a summary of traffic statistics (total requests, bandwidth, and latency): use the stats route.
Get a summary of security metrics (total requests, blocked requests, status codes returned, number of human clients, activity of the origin, etc.): use the timeline route.
Get complete data for all requests matching certain criteria (often used for drilling down into trends discovered from the other routes): use the logs route.
Below, we discuss each route in detail.
This route provides API access to the same available in the Dashboard. Here's an example of Top Countries in the Dashboard:
Calling this route returns all metrics of data: all results for "top applications", all results for "top countries", all items for "top sources", and so on. They are combined into a single continuous list:
...where the list of $RESULTs looks something like this (incomplete) example:
We see that in the time period specified in the filters parameter, there were three IP addresses in two countries that sent requests to a single URL.
Some points to note:
The results are organized and grouped together in the list according to their label.
Labels are ordered alphabetically.
Labels can differ in their number of results.
The route returns the "top" results for each label (for example, results with the "ip" label show the IPs that sent the most blocked requests). When there are only a few results for a given label, all are retrieved. When there are many, only the "top" results are retrieved.
The example above is oversimplified. In actual use, the topx route:
Returns much more data per result, not just key and label (see the list of fields below)
Returns more categories than just country, ip, and url (see the discussion of the label field below)
A detailed discussion of topx follows.
Each result contains the fields listed below.
The topx route returns results in a specific order:
Results are grouped together according to their label (i.e., their category).
Labels are ordered alphabetically (see full list below)
Within each label, results are ordered by num_of_blocked_requests, in descending order.
The topx route returns twelve categories of results, each with its own label. The label determines the contents of the key field.
This route returns traffic metrics for the requested time period, broken down into shorter segments of time.
The retrieved metrics are structured like this:
...where each $RESULTS-TIMESEGMENT-x has this structure:
This route returns security metrics for the requested time period, broken down into shorter segments of time.
The retrieved metrics are structured like this:
...where each $RESULTS-TIMESEGMENT-x has this structure:
...and each $STATUS-DATA-x contains the number of responses with a specific status:
This route returns all requests that match the filter parameters, up to the number of requests specified. The results are returned like this:
Each $REQUEST has this structure:
...where the $FIELDs are the Field names listed in the filters discussion, and the $VALUEs are their values, if any. So a request looks like this:
bot
boolean
branch
string
bytes_sent
integer
challenge
boolean
challenge_type
string
cf_restrict_triggers
array
cf_triggers
Populated if the request triggered a Content Filter Rule. Contains keys: action, extra, name, risk_level, ruleid, section, trigger_id, trigger_name, value. All have string values, except for risk_level, which is an integer.
challenge
boolean
challenge_type
string
cookies
Can inspect specific cookies or all cookies. See .
country
string
dr_triggers
array
geo_region
string
gf_triggers
An array of entries, one for each Global Filter that matched the request. Each entry contains these keys: action, extra, name, section, trigger_id, trigger_name, value
headers
Can inspect specific headers or all headers. See .
host
string
hostname
string
human
boolean
ichallenge
boolean
ip
string
logs
array
messages
An array of strings, containing messages added to the event by the system. These can include
method
string
monitor
boolean: whether or not the request triggered a Monitor action.
monitor_reasons
array of strings; the various reasons (if any) that the request triggered Monitor actions.
organization
string
path
string. The path excluding the TLD and excluding arguments; the string begins with "/".
path_parts
string. Contents for mysite.com/abc/123/home.html?foo=true: "path_parts": {
"part1": "abc",
"part2": "123",
"part3": "home.html",
"path": "/abc/123/home.html"
} To match the second part of this example: path_parts["part2"]="123" {"field": "path_parts", "key": "^part2$", "op": "eq", "value": "123"}
port
string
processing_stage
integer: the furthest stage of that was reached. 0: Initialization 2: Global Filtering 3. Flow Control 4. Global Rate Limits 5. Rate Limits 6. ACL Profile 7. Content Filtering
profiling
array of items containing the security settings relevant to this request. Each item contains: a name (secpol, mapping, flow, limit, acl, content_filter) and value (the internal ID of that setting).
protocol
string
proxy
array of items containing proxy-related data. Each item contains a name and value. The names are: additional_tags, bytes_sent, container, geo_as_domain, geo_as_name, geo_as_type, geo_company_country, geo_company_domain, geo_company_type, geo_lat, geo_long, geo_mobile_carrier, geo_mobile_country, geo_mobile_mcc, geo_mobile_mnc, realip, request_id, request_length, request_time, ssl_cipher, ssl_protocol, status.
query
string. Example: for mysite.com/page?code=117, this is ?code=117.
rbz_latency
integer
rbzsessionid
Cookie set by L11WAAP. Example query string and JSON: cookies["rbzsessionid"]="57870178706cb50db6d41aab" {"field": "cookies", "key": "^rbzsessionid$", "op": "eq", "value": "578701713f70dcd8706cb50db6d41aab"}
reason
string. The reason, if any, the request was blocked.
referer
string
request_id
string
request_length
integer
request_time
float
result
string; the disposition of the request. A way to quickly see anomalies is to search for {"field": "result", "op": "not eq", "value": "Passed"}
rl_triggers
array; the reasons (if any) that rate limits were triggered.
security_config
The configuration of security settings when this request was processed. Keys and data types are: acl_active (boolean)
cf_active (boolean)
cf_rules (integer)
gf_rules (integer)
revision (string)
rl_rules (integer)
secpolentryid (string)
secpolid (string)
session
string
session_ids
array
status
integer
tags
array of strings: all the tags attached to the request
time_period
integer; the Epoch Unix timestamp of the request
timestamp
string; date and time
trigger_counters
The number of times an Action was triggered, and the source of the triggers (ACL Profile, Content Filtering, Global Filters, or Rate Limits). This is a collection of keys (counters) and values (integers with the value of each counter). Counter names are strings: acl, cf, cf_restrict, dr, gf, rl. Sample filter condition: {"field": "trigger_counters", "key": "acl", "value": 0, "op": "gt"}
upstream_addr
array of strings
upstream_data
array of elements: {addr (string), response_time (float), status (integer)}
upstream_response_time
float or null
upstream_status
array of integers
url
string
user_agent
string
version
string
waap_id
Cookie set by L11WAAP. Example query string and JSON: cookies["waap_id"]="Jc491eLWqTBOfDnJwNk" {"field": "cookies", "key": "^waap_id$", "op": "eq", "value": "Jc491eLWqTBOfDnJwNk"}
in
integer / float / string
checks if numeric/string value is in a list of values
regex
string
checks if string has a match with a regex
between
integer / float / timestamp
checks if value between two numbers/ timestamps. Does not depend on order.
first_geo_country
string
First entry in the list of countries
first_organization
string
First entry in the list of organizations
key
string
Content varies; see discussion below.
label
string
Category of result. See discussion below.
max_origin_time
float
The longest amount of processing time by the origin among these requests. If no requests reached the origin, this will be null.
max_rbz_time
float
The longest amount of processing time by L11WAAP among these requests.
max_total_time
float
The longest amount of total processing time among these requests.
min_origin_time
float
The shortest amount of processing time by the origin among these requests. If no requests reached the origin, this will be null.
min_rbz_time
float
The shortest amount of processing time by L11WAAP among these requests.
min_total_time
float
The shortest amount of total processing time among these requests.
num_of_blocked_requests
integer
num_of_bot_requests
integer
num_of_challenges
integer
num_of_human_requests
integer
num_of_monitored_requests
integer
Includes all requests that triggered a "monitor" action, even if they were blocked as well.
num_of_requests
integer
sum_of_bytes_sent
integer
sum_of_request_length
integer
reason
reason the request was monitored or blocked
referer
referer string
total_time
target URL
url
target URL
user_agent
user agent string
waap_id
waap_id cookie value
Number of requests rejected by the origin
num_of_requests
Total requests received during the time period
num_of_sessions
Number of unique sessions
sum_of_sent_bytes
Total bytes sent
time_period
Beginning of time segment, as an Epoch Unix integer (e.g., 1718186400)
timeperiod_string
Beginning of time segment, as a string (e.g., "2024-06-12 10:00:00")
acl_triggers
Populated during evaluation of the active ACL Profile. Contains keys: acl_action
action (the type of Action that was triggered)
extra (currently unused)
tags
trigger_id
trigger_name All are strings, except for tags, which is an array of strings.
arguments
Arguments of the request, if any. Query string and JSON examples for mysite.com/page?foo=1 :
arguments["foo"]="1"
{"field": "arguments", "key": "^foo$", "op": "eq", "value": "1"}
asn
string
authority
string
biometric
array
blocked
boolean
is
boolean
checks if value is True or False
eq
integer / float / string
checks exact match for numeric/string value
gt/ lt
integer / float
checks if value is greater/less than
gte/ lte
integer / float
avg_origin_time
float
The average amount of processing time by the origin for these requests. If no requests reached the origin, this will be null.
avg_rbz_time
float
The average amount of processing time by L11WAAP for these requests.
avg_total_time
float
The average total amount of processing time for these requests.
first_asn
string
country
country name
host
host name or IP
ip
IP address
organization
organization
origin_time
target URL
rbz_time
target URL
avg_latency
Average latency in seconds
hostname
Host
num_of_requests
Total requests received during the time period
sum_of_bandwidth
Total bytes sent and received
time_period
Beginning of time segment, as an Epoch Unix integer (e.g., 1718186400)
timeperiod_string
Beginning of time segment, as a string (e.g., "2024-06-12 10:00:00")
array_origin_status_codes
An array: each element contains a status code and the number of responses from the origin with that code. If no requests reached the origin during the specified time period, the array will be empty.
array_status_codes
An array: each element contains a status code and the number of responses from L11WAAP with that code.
num_of_blocked_requests
Requests that were blocked
num_of_challenges
Number of times L11WAAP issued a bot challenge
num_of_human_requests
Requests from human (i.e., non-bot) clients
num_of_ip
Number of IPs used by clients

checks if value is greater/less than or equal
First entry in the list of ASNs
num_of_origin_blocked_requests
Update an existing set of Actions for a configuration
{}List of tags to apply
[]Need to be one of predefined strings
Create complete set of Actions for a configuration
{}List of tags to apply
[]Need to be one of predefined strings
Update an existing set of Content Filter Rules for a configuration
Category of the rule
""Log message for this rule
Matching domain(s) regex
Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)
Subcategory of the rule
List of tags to apply
[]Create a complete set of Content Filter Rules for a configuration
Category of the rule
""Log message for this rule
Matching domain(s) regex
Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)
Subcategory of the rule
List of tags to apply
[]Updates an existing set of ACL Profiles for a configuration
Create a complete set of ACL Profiles for a configuration
Retrieve traffic data using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data
1000Filters for request in format selected below (JSON or query string)
{"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}if set to true the request will return rendered SQL without running it, for debug purposes
true | falseDatabase to get data from
bigqueryPossible values: syntax of query
jsonGet quarantined list
Database to get data from
mongodbPossible values: Syntax of query
string_queryPossible values: Get stats (time_period, counter, hostname, bandwidth, latency) using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data
Filters for request in format selected below (JSON or query string)
{"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}if set to true the request will return rendered SQL without running it, for debug purposes
true | falseDatabase to get data from
bigqueryPossible values: Get timeline (time_period, sessions, remote_addr, all_hits, blocked, origin_blocked, challenge, is_human, statuses stats, origin statuses stats, bytes_sent) using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data
Filters for request in format selected below (JSON or query string)
{"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}if set to true the request will return rendered SQL without running it, for debug purposes
true | falseDatabase to get data from
bigqueryPossible values: syntax of query
jsonConvert a query string (as used in the UI Dashboard and Events Log) into JSON format.
Filter string has been converted successfully
Misconfigured request
Get topx stats using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data
Filters for request in format selected below (JSON or query string)
{"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}if set to true the request will return rendered SQL without running it, for debug purposes
true | falseDatabase to get data from
bigqueryPossible values: Update an existing set of Global Filters for a configuration
{}Create a complete set of Global Filters for a configuration
{}Update an existing set of Edge Functions for a configuration
Edge Function Code
""Unique id
^[A-Za-z0-9_]*$Create a complete set of Edge Functions for a configuration
Edge Function Code
""Unique id
^[A-Za-z0-9_]*${
"AND": [
{
"field": "timestamp",
"op": "between",
"value": [
"2024-06-06 09:31:00",
"2024-06-06 09:36:00"
]
},
{
"field": "tags",
"op": "regex",
"value": "unrecognized"
}
]
}{
"AND": [
{
"field": "timestamp",
"op": "between",
"value": [
"2024-06-06 09:31:00",
"2024-06-06 09:36:00"
]
},
{
"field": "status",
"op": "eq",
"value": 301
}
]
}{
"AND": [
$CONDITION1,
$CONDITION2,
...
$CONDITIONn
]
}{
"field": "timestamp",
"op": "between",
"value": [
"$TIMESTAMP1",
"$TIMESTAMP2"
]
}{
"field": "$FIELD_NAME",
"op": "$OPERATOR",
"key": "$KEY",
"value": $VALUE
}{
"NOT": {
"field": "$FIELD_NAME",
"op": "$OPERATOR",
"key": "$KEY",
"value": $VALUE
}
}{
"AND": [
{"field": "timestamp", "op": "between", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"]},
{"field": "method", "value":"^P.*T$", "op":"regex"}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
{"field": "tags", "value": ["geo", "location"], "op": "in"}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
{"field": "cookies", "key": "analytics_.*", "value": "gcp_.*", "op": "regex"}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
{"field": "cookies", "value": "gcp_.*", "op": "regex"}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
{"field": "security_config", "key": "acl_active", "value": 11, "op": "gt"}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-07-14 06:52:37", "2022-07-12 06:52:37"], "op": "between"},
{
"field": "cf_triggers",
"conditions": [
{"field": "risk_level", "value": 2, "op": "gt"},
{"field": "ruleid", "value": "100037", "op": "eq"}
]
}
]
}{
"AND": [
{"field": "timestamp", "value": ["2022-08-08 01:15:25", "2022-08-08 01:52:28"], "op": "between"},
{"field": "tags", "value":"geo-continent-name:north-america", "op": "eq"},
{"field": "agent", "key": "ephemeral_id", "value": "029ab6f-6d15-4290-b44f-9133", "op": "regex"},
{"field": "trigger_counters", "key": "acl","value": 2,"op": "not gt"},
{"field": "headers", "key": "x-forwarded.*", "value": "3.65.14.177", "op": "regex"},
{"field": "path_parts", "key": "^part3$", "value": "^-1&", "op": "regex"},
{"field": "security_config", "key": "cf_active", "value": true, "op": "not eq"},
{"field": "ip", "value": ["2.55.96.231", "23.65.14.177", "3.1.92.15", "8.206.254.196"], "op": "in"}
]
}{
"data": {
"results": [
$RESULT1,
$RESULT2,
$RESULT3,
...
$RESULTn
],
"statistics": {
"bytes_billed": null,
"bytes_processed": null,
"elapsed_ms": 0
}
},
"status": 200
}"results": [
{
"key": "China",
"label": "country"
},
{
"key": "United States",
"label": "country"
},
{
"key": "161.1.50.2",
"label": "ip"
},
{
"key": "101.6.123.53",
"label": "ip"
},
{
"key": "161.1.50.5",
"label": "ip"
},
{
"key": "mysite.com/login",
"label": "url"
}
]
{
"data": {
"results": [
$RESULTS-TIMESEGMENT-1,
$RESULTS-TIMESEGMENT-2,
...
$RESULTS-TIMESEGMENT-n
],
"statistics": {
"bytes_billed": null,
"bytes_processed": null,
"elapsed_ms": 0
}
},
"status": 200
}{
"avg_latency": float,
"hostname": string,
"num_of_requests": integer,
"sum_of_bandwidth": integer,
"time_period": integer,
"timeperiod_string": string
}
{
"data": {
"results": [
$RESULTS-TIMESEGMENT-1,
$RESULTS-TIMESEGMENT-2,
...
$RESULTS-TIMESEGMENT-n
],
"statistics": {
"bytes_billed": null,
"bytes_processed": null,
"elapsed_ms": 0
}
},
"status": 200
}{
"array_origin_status_codes": [
$STATUS-DATA-ORIGIN1,
$STATUS-DATA-ORIGIN2,
...
$STATUS-DATA-ORIGINn,
],
"array_status_codes": [
$STATUS-DATA-L11WAAP1,
$STATUS-DATA-L11WAAP2,
...
$STATUS-DATA-L11WAAPn,
],
"num_of_blocked_requests": integer,
"num_of_challenges": integer,
"num_of_human_requests": integer,
"num_of_ip": integer,
"num_of_origin_blocked_requests": integer,
"num_of_requests": integer,
"num_of_sessions": integer,
"sum_of_sent_bytes": integer,
"time_period": integer,
"timeperiod_string": string
}{
"num_of_requests": integer,
"status": integer [an HTTP status code]
}{
"data": {
"results": [
{
$REQUEST1
},
{
$REQUEST2
},
{
$REQUEST3
},
...
{
$REQUESTn
}
],
"statistics": {
"bytes_billed": null,
"bytes_processed": null,
"elapsed_ms": 0
}
},
"status": 200
}$FIELD1: $VALUE1,
$FIELD2: $VALUE2,
...
$FIELDn: $VALUEn"acl_triggers": [],
"arguments": {},
"asn": "AS4837",
...
"user_agent": "curl/7.74.0",
"version": nullActions updated successfully
Validation Error
Actions created successfully
Validation Error
{}List of tags to apply
[]Need to be one of predefined strings
Action updated successfully
Validation Error
{}List of tags to apply
[]Need to be one of predefined strings
Action created successfully
Validation Error
Content Filter Rules updated successfully
Validation Error
Content Filter Rules created successfully
Validation Error
Category of the rule
""Log message for this rule
Matching domain(s) regex
Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)
Subcategory of the rule
List of tags to apply
[]Content Filter Rule updated successfully
Validation Error
Category of the rule
""Log message for this rule
Matching domain(s) regex
Risk level of this rule, between 1 (lowest risk) and 5 (highest risk)
Subcategory of the rule
List of tags to apply
[]Content Filter Rule created successfully
Validation Error
ACL Profiles updated successfully
Validation Error
ACL Profiles created successfully
Validation Error
ACL Profile updated successfully
Validation Error
ACL Profile created successfully
Validation Error
Global Filters retrieved successfully
Global Filters updated successfully
Validation Error
Global Filters created successfully
Validation Error
{}Global Filter updated successfully
Validation Error
{}Global Filter created successfully
Validation Error
Edge Functions retrieved successfully
Edge Functions updated successfully
Validation Error
Edge Functions created successfully
Validation Error
Edge Function Code
""Unique id
^[A-Za-z0-9_]*$Edge Function updated successfully
Validation Error
Edge Function Code
""Unique id
^[A-Za-z0-9_]*$Edge Function created successfully
Validation Error
List of configurations was retrieved successfully
No content
GET /api/v4.0/conf/{config}/actions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}
]
}PUT /api/v4.0/conf/{config}/actions HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 160
[
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}
]{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/actions HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 160
[
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}
]{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/actions HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}PUT /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 158
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 158
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/actions/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/actions/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/actions/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"description": "text",
"id": "text",
"name": "text",
"params": {
"content": "",
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"status": 1
},
"tags": [
"text"
],
"type": "skip"
}
]
}PUT /api/v4.0/conf/{config}/actions/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}GET /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 140
[
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}
]{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 140
[
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}
]{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/content-filter-rules HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}PUT /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 138
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 138
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/content-filter-rules/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/content-filter-rules/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/content-filter-rules/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"category": "text",
"description": "",
"id": "text",
"msg": "text",
"name": "text",
"operand": "text",
"risk": 1,
"subcategory": "text",
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/content-filter-rules/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}GET /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 201
[
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}
]{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 201
[
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}
]{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/acl-profiles HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}PUT /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 199
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 199
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/acl-profiles/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/acl-profiles/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/acl-profiles/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": "text",
"allow": [
"text"
],
"allow_bot": [
"text"
],
"deny": [
"text"
],
"deny_bot": [
"text"
],
"description": "text",
"force_deny": [
"text"
],
"id": "text",
"name": "text",
"passthrough": [
"text"
],
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/acl-profiles/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}GET /api/v4.0/conf/{config}/global-filters HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/global-filters HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 137
[
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}
]{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/global-filters HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 137
[
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}
]{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/global-filters HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}PUT /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 135
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 135
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/global-filters/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/global-filters/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/global-filters/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": null,
"active": true,
"description": "text",
"id": "text",
"mdate": "text",
"name": "text",
"rule": null,
"source": "text",
"tags": [
"text"
]
}
]
}PUT /api/v4.0/conf/{config}/global-filters/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}GET /api/v4.0/conf/{config}/edge-functions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}
]
}PUT /api/v4.0/conf/{config}/edge-functions HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 78
[
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}
]{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/edge-functions HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 78
[
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}
]{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/edge-functions HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}PUT /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 76
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 76
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/edge-functions/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/edge-functions/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/edge-functions/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"code": "text",
"description": "",
"id": "text",
"name": "text",
"phase": "request"
}
]
}PUT /api/v4.0/conf/{config}/edge-functions/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}{
"total": 1,
"items": [
{
"date": "2025-12-15T13:59:37.020Z",
"description": "text",
"id": "text",
"logs": [
{
"date": "2025-12-15T13:59:37.020Z",
"version": "text"
}
],
"version": "text"
}
]
}GET /api/v4.0/conf/configs/{config}/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}PUT /api/v4.0/conf/configs/{config}/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}GET /api/v4.0/conf/configs HTTP/1.1
Host:
Accept: */*
GET /api/v4.0/conf/configs/{config} HTTP/1.1
Host:
Accept: */*
Database to get data from
bigqueryPossible values: syntax of query
jsonLogs has been received successfully
Misconfigured request
Query for quarantined has been run successfully
Misconfigured request
Record(s) was/were successfully deleted
Misconfigured request
Database to get data from
bigqueryPossible values: syntax of query
jsonPossible values: Stats has been received successfully
Misconfigured request
Database to get data from
bigqueryPossible values: syntax of query
jsonTimeline has been received successfully
Misconfigured request
Database to get data from
bigqueryPossible values: syntax of query
jsonPossible values: Topx has been received successfully
Misconfigured request
""List of tags to apply
[]List of content types
[]""A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.
""List of tags to apply
[]When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored
falseA seed which will be used in the masking process
List of tags to apply
[]List of tags to apply
[]Content Filter Profiles updated successfully
Validation Error
""List of tags to apply
[]List of content types
[]""A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.
""List of tags to apply
[]When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored
falseA seed which will be used in the masking process
List of tags to apply
[]List of tags to apply
[]Content Filter Profile updated successfully
Validation Error
""List of tags to apply
[]List of content types
[]""A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.
""List of tags to apply
[]When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored
falseA seed which will be used in the masking process
List of tags to apply
[]List of tags to apply
[]Content Filter Profile created successfully
Validation Error
GET /api/v4.0/data/logs HTTP/1.1
Host:
Accept: */*
{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}GET /api/v4.0/data/quarantined HTTP/1.1
Host:
provider: mongodb
syntax: string_query
Accept: */*
{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}DELETE /api/v4.0/data/quarantined HTTP/1.1
Host:
provider: mongodb
syntax: json
Content-Type: application/json
Accept: */*
Content-Length: 52
{
"config": "text",
"ids": [
"text"
],
"rule_ids": [
"text"
]
}{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}GET /api/v4.0/data/stats HTTP/1.1
Host:
Accept: */*
{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}GET /api/v4.0/data/timeline HTTP/1.1
Host:
Accept: */*
{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}POST /api/v4.0/data/timeline/parse HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 16
{
"query": "text"
}{}GET /api/v4.0/data/topx HTTP/1.1
Host:
Accept: */*
{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}PARAMETERS /api/v4.0/data/logs HTTP/1.1
Host:
Accept: */*
PARAMETERS /api/v4.0/data/stats HTTP/1.1
Host:
Accept: */*
PARAMETERS /api/v4.0/data/timeline HTTP/1.1
Host:
Accept: */*
PARAMETERS /api/v4.0/data/topx HTTP/1.1
Host:
Accept: */*
PUT /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 1562
[
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}
]PUT /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 1560
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}POST /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 1560
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}DELETE /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/content-filter-profiles/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"exclusions": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}
]
}{
"message": "Successfully updated entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}Get a Dynamic Rule from the specified configuration
Dynamic Rule retrieved successfully
Input Error
Validation Error
Internal Server Error
Update an individual Dynamic Rule within a configuration
""Unique id
^[A-Za-z0-9\-\_]*$Dynamic Rule updated successfully
Input Error
Validation Error
Internal Server Error
Create an individual Dynamic Rule within a configuration
^[A-Za-z0-9\-\_]*$""Unique id
^[A-Za-z0-9\-\_]*$Dynamic Rule created successfully
Input Error
Validation Error
Internal Server Error
Delete an individual Dynamic Rule from the specified configuration
Dynamic Rule deleted successfully
Input Error
Validation Error
Internal Server Error
Updates an existing set of Backend Services for a configuration
""Use HTTP/1.1
Load Balancing stickiness model
Custom cookie name
""Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.
Backend Services updated successfully
Validation Error
Create a complete set of Backend Services for a configuration
""Use HTTP/1.1
Load Balancing stickiness model
Custom cookie name
""Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.
Backend Services created successfully
Validation Error
Get an individual Backend Service from the specified configuration
Backend Service retrieved successfully
Validation Error
Update an individual Backend Service within a configuration
""Use HTTP/1.1
Load Balancing stickiness model
Custom cookie name
""Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.
Backend Service updated successfully
Validation Error
Create an individual Backend Service within a configuration
""Use HTTP/1.1
Load Balancing stickiness model
Custom cookie name
""Tranport protocol Service connectivity might follow incoming requests, will always be HTTP, or always HTTPS. Port-bridge mode means that Reblaze will target port numbers identical to incoming requests' port numbers.
Backend Service created successfully
Validation Error
Delete an individual Backend Service from the specified configuration
Backend Service deleted successfully
Validation Error
Set a previous Backend Service version to be the current one
Backend Service reversion was successful
Validation Error
Create a complete set of Content Filter Profiles for a configuration
""List of tags to apply
[]List of content types
[]""A field in a JSON that contains GraphQL query that need to be parsed. The value should be passed in JSONPath format. It supports regex for values as well.
""List of tags to apply
[]When true, arguments, headers or cookies, which contain only alpha numeric characters, will be ignored
falseA seed which will be used in the masking process
List of tags to apply
[]List of tags to apply
[]GET /api/v4.0/conf/{config}/dynamic-rules HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": "text",
"active": true,
"description": "",
"id": "text",
"include": {
"relation": "OR",
"tags": [
"text"
]
},
"exclude": {
"relation": "OR",
"tags": [
"text"
]
},
"name": "text",
"offload_ip_filtering": true,
"tags": [
"text"
],
"target": "text",
"threshold": 1,
"timeframe": 1,
"ttl": 1
}
]
}GET /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"action": "text",
"active": true,
"description": "",
"id": "text",
"include": {
"relation": "OR",
"tags": [
"text"
]
},
"exclude": {
"relation": "OR",
"tags": [
"text"
]
},
"name": "text",
"offload_ip_filtering": true,
"tags": [
"text"
],
"target": "text",
"threshold": 1,
"timeframe": 1,
"ttl": 1
}PUT /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 258
{
"action": "text",
"active": true,
"description": "",
"id": "text",
"include": {
"relation": "OR",
"tags": [
"text"
]
},
"exclude": {
"relation": "OR",
"tags": [
"text"
]
},
"name": "text",
"offload_ip_filtering": true,
"tags": [
"text"
],
"target": "text",
"threshold": 1,
"timeframe": 1,
"ttl": 1
}POST /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 258
{
"action": "text",
"active": true,
"description": "",
"id": "text",
"include": {
"relation": "OR",
"tags": [
"text"
]
},
"exclude": {
"relation": "OR",
"tags": [
"text"
]
},
"name": "text",
"offload_ip_filtering": true,
"tags": [
"text"
],
"target": "text",
"threshold": 1,
"timeframe": 1,
"ttl": 1
}DELETE /api/v4.0/conf/{config}/dynamic-rules/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}GET /api/v4.0/conf/{config}/backend-services HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}
]
}PUT /api/v4.0/conf/{config}/backend-services HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 315
[
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}
]POST /api/v4.0/conf/{config}/backend-services HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 315
[
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}
]DELETE /api/v4.0/conf/{config}/backend-services HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}PUT /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 313
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}POST /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 313
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}DELETE /api/v4.0/conf/{config}/backend-services/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/backend-services/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/backend-services/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"back_hosts": [
{
"backup": true,
"down": true,
"fail_timeout": 1,
"host": "text",
"http_ports": [
80,
8080
],
"https_ports": [
443,
8443
],
"max_fails": 1,
"monitor_state": "text",
"weight": 1
}
],
"description": "",
"http11": true,
"id": "text",
"least_conn": true,
"name": "text",
"sticky": "none",
"sticky_cookie_name": "",
"transport_mode": "default"
}
]
}PUT /api/v4.0/conf/{config}/backend-services/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}Content Filter Profiles created successfully
Validation Error
Get a Mobile Application Group from the specified identifier
Mobile Application Group retrieved successfully
Input Error
Validation Error
Internal Server Error
Update an individual Mobile Application Group within a configuration
Mobile Application Group updated successfully
Input Error
Validation Error
Internal Server Error
Create an individual Mobile Application Group within a configuration
^[A-Za-z0-9\-\_]*$Mobile Application Group created successfully
Input Error
Validation Error
Internal Server Error
Delete an individual Mobile Applicaions Group from the specified configuration
Mobile Application Group deleted successfully
Bad Request
Validation Error
Internal Server Error
Get an individual Log Exporter configuration from the specified configuration
Log Exporter configuration retrieved successfully
Validation Error
Update an individual Log Exporter configuration within a configuration
Name field
This configuration will only take effect when the flag is set to true
falseFormat of the log row that will be exported
Log Exporter configuration updated successfully
Validation Error
Create an individual Log Exporter configuration within a configuration
Name field
This configuration will only take effect when the flag is set to true
falseFormat of the log row that will be exported
Log Exporter configuration created successfully
Validation Error
Delete an individual Log Exporter configuration from the specified configuration
Log Exporter configuration deleted successfully
Validation Error
Get a specific version of an Log Exporter configuration
Log Exporter configuration version retrieved successfully
Validation Error
Set a previous Log Exporters version to be the current one
Log Exporters reversion was successful
Validation Error
Update an existing set of Flow Control Policies for a configuration
This flow is active
""Tags describing requests to exclude from the flow control rule
[]Tags describing requests to include in the flow control rule
[]List of tags to apply
[]The time in which to limit the requests according to the threshold
Flow Control Policies updated successfully
Validation Error
Create a complete set of Flow Control Policies for a configuration
This flow is active
""Tags describing requests to exclude from the flow control rule
[]Tags describing requests to include in the flow control rule
[]List of tags to apply
[]The time in which to limit the requests according to the threshold
Flow Control Policies created successfully
Validation Error
Get a Flow Control Policy from the specified configuration
Flow Control Policy retrieved successfully
Validation Error
Update an individual Flow Control Policy within a configuration
This flow is active
""Tags describing requests to exclude from the flow control rule
[]Tags describing requests to include in the flow control rule
[]List of tags to apply
[]The time in which to limit the requests according to the threshold
Flow Control Policy updated successfully
Validation Error
Create an individual Flow Control Policy within a configuration
This flow is active
""Tags describing requests to exclude from the flow control rule
[]Tags describing requests to include in the flow control rule
[]List of tags to apply
[]The time in which to limit the requests according to the threshold
Flow Control Policy created successfully
Validation Error
Delete an individual Flow Control Policy from the specified configuration
Flow Control Policy deleted successfully
Validation Error
Get list of versions of Flow Control Policies in a configuration
Flow Control Policies version list retrieved successfully
Validation Error
Get a specific version of a Flow Control Policy
Flow Control Policy retrieved successfully
Validation Error
Set a previous Flow Control Policy version to be the current one
Flow Control Policy reversion was successful
Validation Error
Get a specific Certificate for a configuration
Certificate was retrieved successfully
Validation Error
Internal Server Error
Change settings for a specific certificate. ("le_" parameters refer to Let's Encrypt.)
truetrueCertificate modified successfully
No content
Validation Error
No content
Create new certificate for a specific list of domains. Generate new certificate or upload existing one based on input parameters. "le_" parameters refer to Let's Encrypt.
(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?)[]Certificate created
Validation Error
Delete an individual Certificate from the specified configuration
Certificate deleted successfully
No content
Input Error
Validation Error
Internal Server Error
No content
Certificate's PEM retrieved successfully
Input Error
Validation Error
Internal Server Error
Certificate's PFX retrieved successfully
Input Error
Validation Error
Internal Server Error
Retrieve traffic data using 'filters' parameter, explained at https://gb.docs.reblaze.com/reference-information/api/api-access-to-traffic-data
1000Filters for request in format selected below (JSON or query string)
{"AND":[{"field":"timestamp","op":"between","value":["2024-06-06 09:31:00","2024-06-06 09:36:00"]},{"field":"status","op":"eq","value":301}]}if set to true the request will return rendered SQL without running it, for debug purposes
true | falseif set to true the query will be saved in the query history
true | falseDatabase to get data from
bigqueryPossible values: syntax of query
jsonLogs has been received successfully
Misconfigured request
GET /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}
]
}POST /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 1652
[
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}
]DELETE /api/v4.0/conf/{config}/content-filter-profiles HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/content-filter-profiles/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"action": "",
"active": [
"text"
],
"allsections": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"args": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"content_type": [
"text"
],
"cookies": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"decoding": {
"base64": true,
"dual": false,
"html": false,
"unicode": false
},
"description": "",
"graphql_path": "",
"headers": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"id": "text",
"ignore": [
"text"
],
"ignore_alphanum": true,
"ignore_body": false,
"masking_seed": "text",
"name": "text",
"path": {
"enable_max_count": true,
"enable_max_length": true,
"max_count": 1,
"max_length": 1,
"names": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
],
"regex": [
{
"ignore_cf_rule_tags": [
"text"
],
"key": "",
"mask": false,
"reg": "",
"restrict": true
}
]
},
"report": [
"text"
],
"tags": [
"text"
]
}GET /api/v4.0/conf/{config}/content-filter-profiles/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}PUT /api/v4.0/conf/{config}/content-filter-profiles/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}GET /api/v4.0/conf/{config}/mobile-application-groups HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": []
}GET /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"id": "text",
"name": "text",
"description": "text",
"uid_header": "text",
"grace": "text",
"active_config": [],
"signatures": [
{
"active": true,
"hash": "text",
"name": "text"
}
]
}PUT /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 161
{
"id": "text",
"name": "text",
"description": "text",
"uid_header": "text",
"grace": "text",
"active_config": [],
"signatures": [
{
"active": true,
"hash": "text",
"name": "text"
}
]
}{
"message": "Successfully updated entry"
}POST /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 161
{
"id": "text",
"name": "text",
"description": "text",
"uid_header": "text",
"grace": "text",
"active_config": [],
"signatures": [
{
"active": true,
"hash": "text",
"name": "text"
}
]
}{
"message": "Successfully created entry"
}DELETE /api/v4.0/conf/{config}/mobile-application-groups/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}GET /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}
]
}PUT /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 441
[
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}
]POST /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 441
[
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}
]DELETE /api/v4.0/conf/{config}/flow-control-policies HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}PUT /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 439
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}POST /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 439
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}DELETE /api/v4.0/conf/{config}/flow-control-policies/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/flow-control-policies/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/flow-control-policies/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"active": true,
"description": "",
"exclude": [
"text"
],
"id": "text",
"include": [
"text"
],
"key": [
{
"args": "text",
"attrs": "asnFlowSef",
"cookies": "text",
"headers": "text",
"plugins": "text"
}
],
"name": "text",
"steps": [
{
"args": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"cookies": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"headers": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"method": "GET",
"plugins": {
"ANY_ADDITIONAL_PROPERTY": "text"
},
"uri": "text"
}
],
"tags": [
"text"
],
"timeframe": 1
}
]
}PUT /api/v4.0/conf/{config}/flow-control-policies/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}GET /api/v4.0/conf/{config}/certificates HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"cert_body": "text",
"expires": "2025-12-15",
"id": "text",
"issuer": "text",
"le_auto_renew": true,
"le_auto_replace": true,
"le_hash": "",
"private_key": "text",
"san": [
"text"
],
"subject": "text",
"uploaded": "2025-12-15T13:59:37.020Z",
"revoked": false,
"crl": [
"text"
],
"cdp": [
"text"
],
"side": "server"
}
]
}GET /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"links": [
{
"link": "text",
"provider": "text",
"region": "text"
}
],
"cert_body": "text",
"expires": "2025-12-15",
"id": "text",
"issuer": "text",
"le_auto_renew": true,
"le_auto_replace": true,
"le_hash": "",
"private_key": "text",
"san": [
"text"
],
"subject": "text",
"uploaded": "2025-12-15T13:59:37.020Z",
"revoked": false,
"crl": [
"text"
],
"cdp": [
"text"
],
"side": "server"
}PUT /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
Host:
Accept: */*
POST /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 350
{
"provider_links": [
{
"link": "text",
"provider": "text",
"region": "text"
}
],
"cert_body": "text",
"expires": "2025-12-15",
"id": "text",
"issuer": "text",
"le_auto_renew": true,
"le_auto_replace": true,
"le_hash": "",
"private_key": "text",
"san": [
"text"
],
"subject": "text",
"uploaded": "2025-12-15T13:59:37.020Z",
"revoked": false,
"crl": [
"text"
],
"cdp": [
"text"
],
"side": "server"
}DELETE /api/v4.0/conf/{config}/certificates/{entry_id} HTTP/1.1
Host:
Accept: */*
GET /api/v4.0/conf/{config}/certificates/{entry_id}/pem HTTP/1.1
Host:
Accept: */*
binaryGET /api/v4.0/conf/{config}/certificates/{entry_id}/pfx HTTP/1.1
Host:
Accept: */*
binaryGET /api/v4.0/conf/{config}/log-exporters HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"id": "text",
"name": "text",
"active": false,
"filter": "all",
"format": "custom_syslog",
"server_groups": {
"all": true,
"ids": [
"text"
]
},
"connection": {
"host": "https://example.com",
"port": 1,
"protocol": "text",
"tls_mode": "no_tls",
"certificate": {
"chain_data": [],
"cert_body": "text"
}
}
}
]
}GET /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"id": "text",
"name": "text",
"active": false,
"filter": "all",
"format": "custom_syslog",
"server_groups": {
"all": true,
"ids": [
"text"
]
},
"connection": {
"host": "https://example.com",
"port": 1,
"protocol": "text",
"tls_mode": "no_tls",
"certificate": {
"chain_data": [],
"cert_body": "text"
}
}
}PUT /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 252
{
"id": "text",
"name": "text",
"active": false,
"filter": "all",
"format": "custom_syslog",
"server_groups": {
"all": true,
"ids": [
"text"
]
},
"connection": {
"host": "https://example.com",
"port": 1,
"protocol": "text",
"tls_mode": "no_tls",
"certificate": {
"cert_body": "text"
}
}
}POST /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
Host:
Content-Type: application/json
Accept: */*
Content-Length: 252
{
"id": "text",
"name": "text",
"active": false,
"filter": "all",
"format": "custom_syslog",
"server_groups": {
"all": true,
"ids": [
"text"
]
},
"connection": {
"host": "https://example.com",
"port": 1,
"protocol": "text",
"tls_mode": "no_tls",
"certificate": {
"cert_body": "text"
}
}
}DELETE /api/v4.0/conf/{config}/log-exporters/{entry_id} HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully deleted entry"
}GET /api/v4.0/conf/{config}/log-exporters/versions HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"author": "text",
"email": "[email protected]",
"message": "text",
"date": "2025-12-15T13:59:37.020Z",
"version": "42bcc1282349db1e5791484c3d69420b1d8a8bc1",
"parents": [
"f44073242093228b45bff7eb7a065559fa9b46aa"
]
}
]
}GET /api/v4.0/conf/{config}/log-exporters/versions/{version} HTTP/1.1
Host:
Accept: */*
{
"total": 1,
"items": [
{
"id": "text",
"name": "text",
"active": false,
"filter": "all",
"format": "custom_syslog",
"server_groups": {
"all": true,
"ids": [
"text"
]
},
"connection": {
"host": "https://example.com",
"port": 1,
"protocol": "text",
"tls_mode": "no_tls",
"certificate": {
"chain_data": [],
"cert_body": "text"
}
}
}
]
}PUT /api/v4.0/conf/{config}/log-exporters/versions/{version}/revert HTTP/1.1
Host:
Accept: */*
{
"message": "Successfully updated entry"
}{
"message": "Successfully updated entry"
}{
"message": "Successfully created entry"
}{
"data": {
"results": [],
"statistics": {}
},
"status": 1
}GET /api/v4.0/data/logs HTTP/1.1
Host:
Accept: */*