> ## Documentation Index
> Fetch the complete documentation index at: https://ngrok.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Traffic Policy Unit (TPU) Pricing

> Learn about how ngrok uses Traffic Processing Units (TPUs) to measure and charge for Traffic Policy usage.

## Traffic Policy Units (TPUs)

Traffic Processing Units (TPUs) are ngrok's usage-based metric for measuring the work your Traffic Policies perform. Because requests can include any mix of expressions, macros, and actions—often applied only to a subset of traffic—charging a flat rate per request or connection would usually result in overcharging. Instead, ngrok calculates TPUs dynamically for each request, based only on the parts of the Traffic Policy that were actually executed.

TPUs are sold in bundles of 100,000 for \$.10 and are charged as your policies execute.

## TPU pricing breakdown

* [**Actions**](/docs/traffic-policy/how-it-works#actions): Define what happens when a Traffic Policy rule matches (such as adding headers, denying a request, or forwarding traffic).
* [**Macros**](/docs/traffic-policy/macros/): Macros can be used within the Traffic Policy engine to simplify traffic management and dynamic configuration.
* [**Variables**](/docs/traffic-policy/variables/): Metadata about connections or requests that you can use in expressions or actions (such as the client IP or headers).

### Actions

| Name                                                              | TPU Cost |
| ----------------------------------------------------------------- | -------- |
| [add-headers](/docs/traffic-policy/actions/add-headers/)               | Free     |
| [basic-auth](/docs/traffic-policy/actions/basic-auth/)                 | Free     |
| [circuit-breaker](/docs/traffic-policy/actions/circuit-breaker/)       | 10 TPUs  |
| [close-connection](/docs/traffic-policy/actions/close-connection/)     | Free     |
| [compress-response](/docs/traffic-policy/actions/compress-response/)   | 10 TPUs  |
| [custom-response](/docs/traffic-policy/actions/custom-response/)       | Free     |
| [deny](/docs/traffic-policy/actions/deny/)                             | Free     |
| [forward-internal](/docs/traffic-policy/actions/forward-internal/)     | Free     |
| [http-request](/docs/traffic-policy/actions/http-request/)             | 1 TPU    |
| [jwt-validation](/docs/traffic-policy/actions/jwt-validation/)         | 10 TPUs  |
| [log](/docs/traffic-policy/actions/log/)                               | Free     |
| [oauth](/docs/traffic-policy/actions/oauth/)                           | Free     |
| [oidc](/docs/traffic-policy/actions/oidc/)                             | Free     |
| [owasp-crs-request](/docs/traffic-policy/actions/owasp-crs-request/)   | 10 TPUs  |
| [owasp-crs-response](/docs/traffic-policy/actions/owasp-crs-response/) | 10 TPUs  |
| [rate-limit](/docs/traffic-policy/actions/rate-limit/)                 | 1 TPU    |
| [redirect](/docs/traffic-policy/actions/redirect/)                     | 10 TPUs  |
| [remove-headers](/docs/traffic-policy/actions/remove-headers/)         | 1 TPU    |
| [restrict-ips](/docs/traffic-policy/actions/restrict-ips/)             | 10 TPUs  |
| [set-vars](/docs/traffic-policy/actions/set-vars/)                     | Free     |
| [terminate-tls](/docs/traffic-policy/actions/terminate-tls/)           | 100 TPUs |
| [url-rewrite](/docs/traffic-policy/actions/url-rewrite/)               | 10 TPUs  |
| [verify-webhook](/docs/traffic-policy/actions/verify-webhook/)         | 1 TPU    |

### Macros

| Name                                                                                  | TPU Cost                 |
| ------------------------------------------------------------------------------------- | ------------------------ |
| [b64.decode(string)](/docs/traffic-policy/macros/#base64)                                  | 3 TPUs per GB after 1 GB |
| [b64.encode(string)](/docs/traffic-policy/macros/#base64)                                  | 3 TPUs per GB after 1 GB |
| [basic\_auth.encode(username, password)](/docs/traffic-policy/macros/#basic-auth)          | Free                     |
| [http.header(name)](/docs/traffic-policy/macros/#http-requests)                            | Free                     |
| [http.header(name, default)](/docs/traffic-policy/macros/#http-requests)                   | Free                     |
| [http.param(name)](/docs/traffic-policy/macros/#http-requests)                             | Free                     |
| [http.param(name, default)](/docs/traffic-policy/macros/#http-requests)                    | Free                     |
| [http.path()](/docs/traffic-policy/macros/#http-requests)                                  | Free                     |
| [http.path\_segment(index)](/docs/traffic-policy/macros/#http-requests)                    | Free                     |
| [http.path\_segment(index, default)](/docs/traffic-policy/macros/#http-requests)           | Free                     |
| [http.query()](/docs/traffic-policy/macros/#http-requests)                                 | Free                     |
| [http.query\_param(name)](/docs/traffic-policy/macros/#http-requests)                      | Free                     |
| [http.query\_param(name, default)](/docs/traffic-policy/macros/#http-requests)             | Free                     |
| [http.remote\_addr()](/docs/traffic-policy/macros/#http-requests)                          | Free                     |
| [http.request\_body()](/docs/traffic-policy/macros/#http-requests)                         | Free                     |
| [http.request\_body\_json()](/docs/traffic-policy/macros/#http-requests)                   | Free                     |
| [http.request\_body\_query()](/docs/traffic-policy/macros/#http-requests)                  | Free                     |
| [http.request\_method()](/docs/traffic-policy/macros/#http-requests)                       | Free                     |
| [http.request\_uri()](/docs/traffic-policy/macros/#http-requests)                          | Free                     |
| [http.response\_body()](/docs/traffic-policy/macros/#http-responses)                       | Free                     |
| [http.response\_body\_json()](/docs/traffic-policy/macros/#http-responses)                 | Free                     |
| [http.response\_body\_query()](/docs/traffic-policy/macros/#http-responses)                | Free                     |
| [http.scheme()](/docs/traffic-policy/macros/#http-requests)                                | Free                     |
| [http.status()](/docs/traffic-policy/macros/#http-responses)                               | Free                     |
| [http.status\_text()](/docs/traffic-policy/macros/#http-responses)                         | Free                     |
| [http.user\_agent()](/docs/traffic-policy/macros/#http-requests)                           | Free                     |
| [inCidrRange(ip, cidr)](/docs/traffic-policy/macros/#utility)                              | Free                     |
| [inCidrRanges(ip, cidrs)](/docs/traffic-policy/macros/#utility)                            | Free                     |
| [json.decode(string)](/docs/traffic-policy/macros/#json)                                   | 3 TPUs per GB after 1 GB |
| [json.encode(list\| map)](/docs/traffic-policy/macros/#json)                               | 3 TPUs per GB after 1 GB |
| [list.encodeJson()](/docs/traffic-policy/macros/#lists)                                    | Free                     |
| [object.encodeJson()](/docs/traffic-policy/macros/#maps)                                   | Free                     |
| [object.encodeQueryString()](/docs/traffic-policy/macros/#maps)                            | Free                     |
| [queryString.decode(string)](/docs/traffic-policy/macros/#query-string)                    | Free                     |
| [queryString.encode(map)](/docs/traffic-policy/macros/#query-string)                       | Free                     |
| [rand.double()](/docs/traffic-policy/macros/#random)                                       | Free                     |
| [rand.int(min, max)](/docs/traffic-policy/macros/#random)                                  | Free                     |
| [security.secret(string, string)](/docs/traffic-policy/macros/#secrets)                    | Free                     |
| [string.decodeBase64()](/docs/traffic-policy/macros/#string)                               | Free                     |
| [string.decodeJson()](/docs/traffic-policy/macros/#string)                                 | Free                     |
| [string.decodeQueryString()](/docs/traffic-policy/macros/#string)                          | Free                     |
| [string.encodeBase64()](/docs/traffic-policy/macros/#string)                               | Free                     |
| [string.escapeUrl()](/docs/traffic-policy/macros/#string)                                  | Free                     |
| [string.isJson()](/docs/traffic-policy/macros/#string)                                     | Free                     |
| [string.isQueryString()](/docs/traffic-policy/macros/#string)                              | Free                     |
| [string.isURL()](/docs/traffic-policy/macros/#string)                                      | Free                     |
| [string.parseUrl()](/docs/traffic-policy/macros/#string)                                   | Free                     |
| [string.unescapeUrl()](/docs/traffic-policy/macros/#string)                                | Free                     |
| [url.escape(string)](/docs/traffic-policy/macros/#url)                                     | Free                     |
| [url.parse(string)](/docs/traffic-policy/macros/#url)                                      | Free                     |
| [url.unescape(string)](/docs/traffic-policy/macros/#url)                                   | Free                     |
| [utility.base64\_decode(string)](/docs/traffic-policy/macros/#base64)                      | Free                     |
| [utility.base64\_encode(string)](/docs/traffic-policy/macros/#base64)                      | Free                     |
| [utility.basic\_auth\_encode(username, password)](/docs/traffic-policy/macros/#basic-auth) | Free                     |
| [utility.in\_cidr\_range(ip, cidr)](/docs/traffic-policy/macros/#utility)                  | Free                     |
| [utility.in\_cidr\_ranges(ip, cidrs)](/docs/traffic-policy/macros/#utility)                | Free                     |
| [utility.json\_decode(string)](/docs/traffic-policy/macros/#json)                          | Free                     |
| [utility.json\_encode(list \| map)](/docs/traffic-policy/macros/#json)                     | Free                     |
| [utility.list\_encode\_json()](/docs/traffic-policy/macros/#lists)                         | Free                     |
| [utility.object\_encode\_json()](/docs/traffic-policy/macros/#maps)                        | Free                     |
| [utility.object\_encode\_query\_string()](/docs/traffic-policy/macros/#maps)               | Free                     |
| [utility.query\_string\_decode(string)](/docs/traffic-policy/macros/#query-string)         | Free                     |
| [utility.query\_string\_encode(map)](/docs/traffic-policy/macros/#query-string)            | Free                     |
| [utility.rand\_double()](/docs/traffic-policy/macros/#random)                              | Free                     |
| [utility.rand\_int(min, max)](/docs/traffic-policy/macros/#random)                         | Free                     |
| [utility.string\_decode\_base64()](/docs/traffic-policy/macros/#string)                    | Free                     |
| [utility.string\_decode\_json()](/docs/traffic-policy/macros/#string)                      | Free                     |
| [utility.string\_decode\_query\_string()](/docs/traffic-policy/macros/#string)             | Free                     |
| [utility.string\_encode\_base64()](/docs/traffic-policy/macros/#string)                    | Free                     |
| [utility.string\_escape\_url()](/docs/traffic-policy/macros/#string)                       | Free                     |
| [utility.string\_is\_json()](/docs/traffic-policy/macros/#string)                          | Free                     |
| [utility.string\_is\_query\_string()](/docs/traffic-policy/macros/#string)                 | Free                     |
| [utility.string\_is\_url()](/docs/traffic-policy/macros/#string)                           | Free                     |
| [utility.string\_parse\_url()](/docs/traffic-policy/macros/#string)                        | Free                     |
| [utility.string\_unescape\_url()](/docs/traffic-policy/macros/#string)                     | Free                     |
| [utility.url\_escape(string)](/docs/traffic-policy/macros/#url)                            | Free                     |
| [utility.url\_parse(string)](/docs/traffic-policy/macros/#url)                             | Free                     |
| [utility.url\_unescape(string)](/docs/traffic-policy/macros/#url)                          | Free                     |

### Variables

| Name                                                                                                        | TPU Cost |
| ----------------------------------------------------------------------------------------------------------- | -------- |
| [actions.ngrok.add\_headers.headers\_added](/docs/traffic-policy/variables/action/#add-headers)                  | Free     |
| [actions.ngrok.basic\_auth.credentials.presented](/docs/traffic-policy/variables/action/#basic-auth)             | Free     |
| [actions.ngrok.basic\_auth.credentials.username](/docs/traffic-policy/variables/action/#basic-auth)              | Free     |
| [actions.ngrok.basic\_auth.credentials.authorized](/docs/traffic-policy/variables/action/#basic-auth)            | Free     |
| [actions.ngrok.compress.already\_compressed](/docs/traffic-policy/variables/action/#compress-response)           | Free     |
| [actions.ngrok.compress.negotiated\_algorithm](/docs/traffic-policy/variables/action/#compress-response)         | Free     |
| [actions.ngrok.http\_request.error.code](/docs/traffic-policy/variables/action/#http-request)                    | Free     |
| [actions.ngrok.http\_request.error.message](/docs/traffic-policy/variables/action/#http-request)                 | Free     |
| [actions.ngrok.http\_request.attempts](/docs/traffic-policy/variables/action/#http-request)                      | Free     |
| [actions.ngrok.http\_request.req](/docs/traffic-policy/variables/action/#http-request)                           | Free     |
| [actions.ngrok.http\_request.res](/docs/traffic-policy/variables/action/#http-request)                           | Free     |
| [actions.ngrok.jwt\_validation.tokens](/docs/traffic-policy/variables/action/#jwt-validation)                    | Free     |
| [actions.ngrok.jwt\_validation.error.code](/docs/traffic-policy/variables/action/#jwt-validation)                | Free     |
| [actions.ngrok.jwt\_validation.error.message](/docs/traffic-policy/variables/action/#jwt-validation)             | Free     |
| [actions.ngrok.log.metadata](/docs/traffic-policy/variables/action/#log)                                         | Free     |
| [actions.ngrok.oauth.error.code](/docs/traffic-policy/variables/action/#oauth)                                   | Free     |
| [actions.ngrok.oauth.error.message](/docs/traffic-policy/variables/action/#oauth)                                | Free     |
| [actions.ngrok.oauth.identity.id](/docs/traffic-policy/variables/action/#oauth)                                  | Free     |
| [actions.ngrok.oauth.identity.email](/docs/traffic-policy/variables/action/#oauth)                               | Free     |
| [actions.ngrok.oauth.identity.name](/docs/traffic-policy/variables/action/#oauth)                                | Free     |
| [actions.ngrok.oauth.identity.provider\_user\_id](/docs/traffic-policy/variables/action/#oauth)                  | Free     |
| [actions.ngrok.oauth.identity.current\_provider\_session\_id](/docs/traffic-policy/variables/action/#oauth)      | Free     |
| [actions.ngrok.oauth.access\_token](/docs/traffic-policy/variables/action/#oauth)                                | Free     |
| [actions.ngrok.oauth.refresh\_token](/docs/traffic-policy/variables/action/#oauth)                               | Free     |
| [actions.ngrok.oauth.expires\_at](/docs/traffic-policy/variables/action/#oauth)                                  | Free     |
| [actions.ngrok.oauth.session\_timed\_out](/docs/traffic-policy/variables/action/#oauth)                          | Free     |
| [actions.ngrok.oauth.session\_max\_duration\_reached](/docs/traffic-policy/variables/action/#oauth)              | Free     |
| [actions.ngrok.oidc.error.code](/docs/traffic-policy/variables/action/#openid-connect-oidc)                      | Free     |
| [actions.ngrok.oidc.error.message](/docs/traffic-policy/variables/action/#openid-connect-oidc)                   | Free     |
| [actions.ngrok.oidc.identity.id](/docs/traffic-policy/variables/action/#openid-connect-oidc)                     | Free     |
| [actions.ngrok.oidc.identity.email](/docs/traffic-policy/variables/action/#openid-connect-oidc)                  | Free     |
| [actions.ngrok.oidc.identity.name](/docs/traffic-policy/variables/action/#openid-connect-oidc)                   | Free     |
| [actions.ngrok.oidc.identity.provider\_user\_id](/docs/traffic-policy/variables/action/#openid-connect-oidc)     | Free     |
| [actions.ngrok.oidc.identity.current\_session\_id](/docs/traffic-policy/variables/action/#openid-connect-oidc)   | Free     |
| [actions.ngrok.oidc.identity\_token](/docs/traffic-policy/variables/action/#openid-connect-oidc)                 | Free     |
| [actions.ngrok.oidc.access\_token](/docs/traffic-policy/variables/action/#openid-connect-oidc)                   | Free     |
| [actions.ngrok.oidc.refresh\_token](/docs/traffic-policy/variables/action/#openid-connect-oidc)                  | Free     |
| [actions.ngrok.oidc.expires\_at](/docs/traffic-policy/variables/action/#openid-connect-oidc)                     | Free     |
| [actions.ngrok.oidc.session\_timed\_out](/docs/traffic-policy/variables/action/#openid-connect-oidc)             | Free     |
| [actions.ngrok.oidc.session\_max\_duration\_reached](/docs/traffic-policy/variables/action/#openid-connect-oidc) | Free     |
| [actions.ngrok.oidc.userinfo\_refreshed](/docs/traffic-policy/variables/action/#openid-connect-oidc)             | Free     |
| [actions.ngrok.rate\_limit.bucket\_key](/docs/traffic-policy/variables/action/#rate-limit)                       | Free     |
| [actions.ngrok.rate\_limit.limited](/docs/traffic-policy/variables/action/#rate-limit)                           | Free     |
| [actions.ngrok.rate\_limit.error.code](/docs/traffic-policy/variables/action/#rate-limit)                        | Free     |
| [actions.ngrok.rate\_limit.error.message](/docs/traffic-policy/variables/action/#rate-limit)                     | Free     |
| [actions.ngrok.redirect.matches](/docs/traffic-policy/variables/action/#redirect)                                | Free     |
| [actions.ngrok.redirect.url](/docs/traffic-policy/variables/action/#redirect)                                    | Free     |
| [actions.ngrok.redirect.error.code](/docs/traffic-policy/variables/action/#redirect)                             | Free     |
| [actions.ngrok.redirect.error.message](/docs/traffic-policy/variables/action/#redirect)                          | Free     |
| [actions.ngrok.remove\_headers.headers\_removed](/docs/traffic-policy/variables/action/#remove-headers)          | Free     |
| [actions.ngrok.restrict\_ips.action](/docs/traffic-policy/variables/action/#restrict-ips)                        | Free     |
| [actions.ngrok.restrict\_ips.matched\_cidr](/docs/traffic-policy/variables/action/#restrict-ips)                 | Free     |
| [actions.ngrok.restrict\_ips.error.code](/docs/traffic-policy/variables/action/#restrict-ips)                    | Free     |
| [actions.ngrok.restrict\_ips.error.message](/docs/traffic-policy/variables/action/#restrict-ips)                 | Free     |
| [actions.ngrok.url\_rewrite.matches](/docs/traffic-policy/variables/action/#url-rewrite)                         | Free     |
| [actions.ngrok.url\_rewrite.url](/docs/traffic-policy/variables/action/#url-rewrite)                             | Free     |
| [actions.ngrok.url\_rewrite.error.code](/docs/traffic-policy/variables/action/#url-rewrite)                      | Free     |
| [actions.ngrok.url\_rewrite.error.message](/docs/traffic-policy/variables/action/#url-rewrite)                   | Free     |
| [actions.ngrok.verify\_webhook.verified](/docs/traffic-policy/variables/action/#verify-webhook)                  | Free     |
| [conn.bytes\_in](/docs/traffic-policy/variables/connection/#connbytes-in)                                        | Free     |
| [conn.bytes\_out](/docs/traffic-policy/variables/connection/#connbytes-out)                                      | Free     |
| [conn.client\_ip](/docs/traffic-policy/variables/connection/#connclient-ip)                                      | Free     |
| [conn.client\_port](/docs/traffic-policy/variables/connection/#connclient-port)                                  | Free     |
| [conn.server\_ip](/docs/traffic-policy/variables/connection/#connserver-ip)                                      | Free     |
| [conn.server\_port](/docs/traffic-policy/variables/connection/#connserver-port)                                  | Free     |
| [conn.server\_region](/docs/traffic-policy/variables/connection/#connserver-region)                              | Free     |
| [conn.ts.start](/docs/traffic-policy/variables/connection/#conntsstart)                                          | Free     |

## Traffic Policy Unit (TPU) discounts at scale

The Pay-as-you-go plan provides discounts on TPUs for large scale deployments so you always get the best price as you grow. Discounted pricing is as follows:

| Count | TPU Cost     |
| ----- | ------------ |
| 0+    | \$.10/100k   |
| 1M+   | \$.075/100k  |
| 10M+  | \$.055/100k  |
| 100M+ | \$0.035/100k |
| 1B+   | \$0.025/100k |
