{% extends "base.html" %} {% block content %}

Rate Limits

Active rate limit policies for registered routes.

Refresh
{# ── Rate limit cards ─────────────────────────────────────────────── #} {# Multi-service (service selected): Global (left) + Service (right) in one responsive row. Stacks to a single column on mobile. No service selected: Global rate limit takes the full width. #} {% if selected_service %}
{# Left — all-services global rate limit #} {% with grl=global_rl %} {% include "partials/global_rl_card.html" %} {% endwith %}
{# Right — per-service rate limit #} {% with srl=service_rl, service=selected_service %} {% include "partials/service_rl_card.html" %} {% endwith %}
{% else %}
{% with grl=global_rl %} {% include "partials/global_rl_card.html" %} {% endwith %}
{% endif %} {# ── Policies table ─────────────────────────────────────────────── #}

Policies

{{ pagination.total }} route{% if pagination.total != 1 %}s{% endif %}{% if pagination.total_pages > 1 %} · page {{ pagination.page }}/{{ pagination.total_pages }}{% endif %}
{% if policies %}
{% include "partials/rate_limit_rows.html" %}
Path Limit Actions
{% include "partials/pagination.html" %} {% else %}

No rate limit policies configured

Use the Unprotected Routes section below or decorate routes with @rate_limit("100/minute").

{% endif %}
{# ── Unprotected routes ──────────────────────────────────────────── #} {% if unrated_routes %}

Unprotected Routes

{{ unrated_routes | length }} route{% if unrated_routes | length != 1 %}s{% endif %} without a rate limit
{% for state in unrated_routes %} {% set svc = state.service or "" %} {% set raw_path = state.path %} {% set display_path = raw_path[svc | length + 1:] if svc and raw_path.startswith(svc + ":") else raw_path %} {% set encoded = display_path | encode_path %} {% endfor %}
Route Status Action
{{ display_path }} {% if svc %} {{ svc }} {% endif %}
{{ state.status | upper }}
{% endif %} {% endblock %}