# Applications limits

An [application](/en/documentation/platform/applications/) runs request and response [rules](/en/documentation/platform/applications/rules-engine/), and it can proxy WebSocket connections to the origin through [WebSocket Proxy](/en/documentation/platform/applications/websocket/). Each Product enabled on it brings bounds of its own: [cache settings](/en/documentation/platform/applications/cache/cache-settings/) and [Real-Time Purge](/en/documentation/platform/applications/cache/real-time-purge/) requests for Cache, the cache TTL floor for Application Accelerator, and processed images for Image Processor. This page states each bound, the answer a call receives where the API refuses it, and the usage each service plan includes.

A default limit bounds one object, one request, or one account. An included amount bounds one month of use, and each service plan includes a different amount. Azion offers three service plans: Hobby, Pro, and Enterprise. On Hobby, use past an included amount may require an upgrade, and Azion may restrict the account. On Pro and Enterprise, Azion bills that use at on-demand rates, and on Pro you can set a spend limit to control the charge.

---

## Applications, rules, and connections

These bounds apply to every application, whichever Products it has enabled. They cover the rules in its Rules Engine, the **Debug Rules** log, the connections it keeps open, and the number of applications an account holds.

### Default limits

Each row names what is bounded and the bound. Azion can raise these limits on request, based on the plan, and the WebSocket connection time is one of them. For an increase, contact the [technical support](/en/documentation/support/) team.

| Scope                                                          | Limit                    |
| -------------------------------------------------------------- | ------------------------ |
| Rules in one application, request and response phases together | 200                      |
| Criteria groups per rule                                       | 1 to 5                   |
| Criteria per group                                             | 1 to 10                  |
| Behaviors per rule                                             | 1 to 10                  |
| Behavior argument                                              | 1,600 characters         |
| **Debug Rules** log size                                       | 1.5 kB                   |
| Maximum WebSocket connection time                              | 15 minutes               |
| Keepalive connection between a user and an application         | Approximately 15 minutes |

The 200 rules are one total that the request phase and the response phase share. For example, an application can carry 150 request rules and 50 response rules, but not 200 of each.

Azion recycles the keepalive connections on its servers approximately every 15 minutes. That cycle bounds how long a connection between a user and an application stays open. An active connection that needs more time can be terminated. When a WebSocket connection is terminated this way, the application handles the closed connection and opens it again. For a large file, fragments or compression raise the transfer speed, so the transfer can finish in time.

To store a large file in fragments, refer to [Cache settings](/en/documentation/platform/applications/cache/cache-settings/#cache). To compress it, refer to [Compress application responses with gzip](/en/documentation/guides/application-performance/delivery-optimization/gzip-compression/).

### Applications per account

The number of applications one account holds depends on its Support service. Mission-Critical sets an amount that is customizable for the account. To request a higher number, contact the [technical support](/en/documentation/support/) team.

| Scope                    | Developer | Business | Enterprise | Mission-Critical |
| ------------------------ | --------- | -------- | ---------- | ---------------- |
| Applications per account | 10        | 50       | 200        | Customizable     |

For what each Support service includes, refer to [Pricing](/en/documentation/fundamentals/pricing/#support).

---

## Cache

Cache bounds a cache setting, the object a cache setting holds, and a Real-Time Purge request. Past a bound that the API checks, the call returns HTTP `400` with an error code and a title. [Tiered Cache](/en/documentation/platform/applications/cache/tiered-cache/) changes two bounds of a cache setting: the lowest TTL it takes and the cache behavior it allows.

For a higher limit on the account, contact the [technical support](/en/documentation/support/) team. The TTL bounds are the exception: the API validates them on every cache setting, and Azion does not raise them on request.

### Cache settings

Each bound in this table applies to one cache setting, from any interface that writes it. The Scope column names the API field and, where one exists, the Console label. The Past the limit column carries the code and the title of the `400` answer.

| Scope                                                          | Limit                                                                               | Past the limit                                                                                                                                         |
| -------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Cache TTL minimum, **Max Age** (`modules.cache.max_age`)       | 60 seconds; 0 seconds with Application Accelerator on the application               | Error `21021`, `Edge Cache Max Age Lower Than The Minimum Allowed By Application's Application Accelerator Module`, with `meta.min_value` set to `60`. |
| Cache TTL minimum with Tiered Cache on                         | 3 seconds, with Application Accelerator on; without it, the 60-second minimum holds | Error `21020`, `Edge Cache Max Age Lower Than The Minimum Allowed By The Tiered Cache Module`, with `meta.min_value` set to `3`.                       |
| Cache TTL maximum                                              | 31,536,000 seconds, one year                                                        | Error `10068`, `Max Value`, with the detail `Ensure this value is less than or equal to 31536000.`                                                     |
| Cache behavior with Tiered Cache on (`modules.cache.behavior`) | `override` only                                                                     | Error `21001`, `It's Not Possible To Use This Edge Cache Behavior.`                                                                                    |
| Browser cache TTL (`browser_cache.max_age`)                    | 0 to 31,536,000 seconds                                                             | Error `10068`, `Max Value`.                                                                                                                            |
| Cache setting name, **Name** (`name`)                          | 250 characters                                                                      | Error `10046`, `Max Length`, with the detail `Ensure this field has no more than 250 characters.`                                                      |

A cache setting with `modules.cache.stale_cache.enabled` set to `true` can serve an expired copy for a limited window. Under the `honor` behavior, the window is the value of the origin's `stale-while-revalidate=<ttl>` directive. Under `override`, or when the origin omits the directive, the window is 300 seconds.

### Cached objects

Two bounds apply to an object that Cache stores: its size, and the size of each fragment of a large file stored in pieces.

| Scope                                                                   | Limit                        |
| ----------------------------------------------------------------------- | ---------------------------- |
| Single object in cache                                                  | 10 GB                        |
| Fragment size of a large file (`modules.cache.large_file_cache.offset`) | 1,024 kB per fragment, fixed |

A fragment size larger than 1,024 returns error `10068`, `Max Value`, with the detail `Ensure this value is less than or equal to 1024.` To change the fragment size, contact the Sales team.

### Real-Time Purge

Each bound in this table applies to a purge request, from any interface that sends one. The Past the limit column carries what the API returns past the bound.

| Scope                                         | Limit            | Past the limit                                                                                                            |
| --------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Objects in one URL or cache key purge request | 50 objects       | Error `10065`, `List Field Max Length`, with the detail `Ensure this field has no more than 50 elements.`                 |
| Wildcards in one purge request                | 1 wildcard       | Error `10065`, `List Field Max Length`, with the detail `Ensure this field has no more than 1 elements.`                  |
| URL or cache key length                       | 4,096 characters | The API does not refuse a longer URL when it receives the request. A purge of one 4,098-character URL returns HTTP `201`. |

Six more bounds set the rate of purge requests, the length of a wildcard, and how much purge history Azion keeps.

| Scope                                                  | Limit                         |
| ------------------------------------------------------ | ----------------------------- |
| URL and cache key purge requests per client            | 200 requests, 50 objects each |
| Objects purged by URL and cache key every 60 seconds   | 10,000 objects                |
| Wildcard purge requests per day, in a 24-hour interval | 2,000 requests                |
| Wildcard length                                        | 256 characters                |
| Requests kept in the purge history                     | 1,000,000 requests            |
| Time a request stays in the purge history              | 6 months                      |

### Included usage per plan

Cache is billed on purges, and each service plan includes a number of them every month.

| Metric | Hobby         | Pro           | Enterprise |
| ------ | ------------- | ------------- | ---------- |
| Purges | 1,000 / month | 2,000 / month | Custom     |

The Purges metric counts each purge operation that the account runs during the month. Tiered Cache is included on every plan. The pricing page lists data transfer under Application Accelerator, so that amount sits with the bounds of [Application Accelerator](#application-accelerator).

For the rate past the included purges, refer to [Pricing](/en/documentation/fundamentals/pricing/#cache). To query the data that Tiered Cache has transferred, refer to [Query usage data from Tiered Cache](/en/documentation/guides/platform/observability/query-tiered-cache-usage-data-with-graphql/).

---

## Application Accelerator

Application Accelerator changes one bound of a cache setting: the shortest time Cache holds an object. `modules.cache.max_age` sets that time in seconds, and Azion Console renders the field as **Max Age** in the **Cache** section of a cache setting. The field takes an integer from 0 to 31,536,000 and refuses any value outside that range. Whether Application Accelerator and Tiered Cache are on decides how low inside the range a cache setting goes.

### Default limits

Each row names a cache TTL bound and the condition that puts it in force.

| Scope             | Limit                        | Applies when                                                                    |
| ----------------- | ---------------------------- | ------------------------------------------------------------------------------- |
| Minimum cache TTL | 60 seconds                   | Application Accelerator is off on the application, with Tiered Cache on or off. |
| Minimum cache TTL | 0 seconds                    | Application Accelerator is on, and Tiered Cache is off.                         |
| Minimum cache TTL | 3 seconds                    | Application Accelerator is on, and Tiered Cache is on.                          |
| Maximum cache TTL | 31,536,000 seconds, one year | Every cache setting, whichever Products are on.                                 |

A **Max Age** lower than the minimum in force returns HTTP `400`. The error is `21021` while Application Accelerator is off, and `21020` while Application Accelerator and Tiered Cache are both on. A value higher than the maximum returns error `10068`. For the error titles, refer to [Cache settings](#cache-settings).

The 3-second floor comes from Tiered Cache rather than from Application Accelerator. Tiered Cache requires at least 3 seconds, which narrows the 0-second floor that Application Accelerator unlocks. A **Max Age** of 0 seconds still keeps the request on the cache path, so it differs from bypassing the cache. For how each one handles a request, refer to [How Applications works](/en/documentation/platform/applications/how-it-works/).

These TTL bounds are validations the API applies to every cache setting, and Azion does not raise them on request. The `cache_vary_by_method` array of a cache setting takes at most 2 values, `post` and `options`, and the API specification sets that cap.

A request that Application Accelerator varies is still bounded by the Products that store the object and run code on it. Cache bounds the object itself: the size of one cached object, and the size of each fragment of a large file. For those values, refer to [Cached objects](#cached-objects). A function the application runs on [Functions](/en/documentation/platform/functions/) carries its own limits on its code and on each invocation. For those values, refer to [Functions limits](/en/documentation/platform/functions/limits/).

### Included usage per plan

Application Accelerator is billed on data transfer, and each service plan includes an amount of it every month.

| Metric        | Hobby        | Pro          | Enterprise |
| ------------- | ------------ | ------------ | ---------- |
| Data transfer | 1 TB / month | 2 TB / month | Custom     |

Cache variation, which the pricing page lists as Custom Cache Keys, and path rewrites are included on every plan. For the rates past the included data transfer, refer to [Pricing](/en/documentation/fundamentals/pricing/#application-accelerator).

---

## Image Processor

Image Processor bounds a single image with three default limits, and each service plan includes a number of processed images every month. The size, width, and height bound one image. The monthly amount bounds the account.

### Default limits

Image Processor applies these default limits to an image. To raise one of them for the account, contact the [technical support](/en/documentation/support/) team.

| Scope          | Limit       |
| -------------- | ----------- |
| Maximum size   | 150 MB      |
| Maximum width  | 3840 pixels |
| Maximum height | 2160 pixels |

Each `ims` parameter also accepts a range of values of its own. For the range of each parameter, refer to [URL parameters](/en/documentation/platform/applications/image-processor/url-parameters/).

### Included usage per plan

Every service plan includes a number of processed images each month, and the amount differs by plan.

| Metric | Hobby         | Pro            | Enterprise |
| ------ | ------------- | -------------- | ---------- |
| Images | 5,000 / month | 10,000 / month | Custom     |

Image Processor counts one image each time it processes an image on a request, whether the request optimizes, crops, resizes, filters, or converts the format. An image that Cache serves without processing does not count, so a derived image already in cache adds nothing on the requests the cache answers. For example, a photograph served in three widths counts as three images. The later requests that the cache answers for those widths count none.

For the rates of the Images metric, refer to [Pricing](/en/documentation/fundamentals/pricing/#image-processor). To query the number of images the account has processed, refer to [Query usage data from Image Processor](/en/documentation/guides/platform/observability/query-image-processor-usage-data-with-graphql/).

---

## Related resources

- [Application Accelerator quickstart](/en/documentation/platform/applications/application-accelerator/quickstart.md): Turn on Application Accelerator and create a cache setting inside these TTL bounds.
- [Application Accelerator settings](/en/documentation/platform/applications/application-accelerator/settings.md): The fields that Application Accelerator unlocks, with their types, enums, and defaults.
- [How Applications works](/en/documentation/platform/applications/how-it-works.md): How a request passes through an application, and where Cache, Application Accelerator, and Image Processor act on it.
- [Real-Time Metrics](/en/documentation/platform/real-time-metrics.md): Where the account watches its Cache, Tiered Cache, and Image Processor traffic against the amounts on this page.
