# View web proxy traffic

> Read the requests your web proxies answered for a domain, by hour and by hostname, and how many the edge blocked or failed.

Source: https://www.coritan.com/docs/websites/traffic/

In the dashboard:

- /dashboard/websites/…/overview: https://www.coritan.com/dashboard/websites

Coritan's edge counts the requests each of your web proxies answers, hour by hour. Read the counts for a domain to see how busy the site is, which hostname takes the traffic, how much the WAF blocks and when the origin failed. A website's **Overview** tab shows the same figures under **Traffic**.

## Before you begin

- The domain, or a name under it, has a web proxy on your account ([Manage a website's web proxy](/docs/websites/proxy/)). A domain without one reads zero, and a deployment's domains are not counted here.
- You need an access token or an account API key ([Authentication](/docs/api/authentication/)). Every team role can read the counts.

## What the counts mean

The counts cover the domain and every hostname under it: `example.com` takes in `shop.example.com`, but not `notexample.com`. Each hostname is one web proxy.

`requests`
: Every request the edge answered, blocked ones included.

`blocked`
: Requests the edge refused with `403` or `429` to protect the website: the WAF, the website's own rules and settings, and rate limits ([Protect a website with the WAF](/docs/websites/waf/)). They count in `requests` and `status_4xx` too.

`bytes_in` and `bytes_out`
: What visitors sent to the edge, and what the edge sent back, in bytes.

`status_2xx`, `status_3xx`, `status_4xx` and `status_5xx`
: Answers by status class. `status_5xx` counts the answers where the origin failed or the edge could not reach it.

`websocket_connections`
: WebSocket connections the edge opened between a visitor and your origin.

`latency_avg_ms`
: How long the edge took to answer a request, on average, in milliseconds. Each hour counts as much as its requests, and the value is `null` when there were no requests.

Some requests are not counted:

- A request the edge answers with a challenge page. Once the visitor passes the challenge, their requests count.
- While an edge is under attack, it keeps counting the requests it blocks and stops counting the ones it passes to your origin.
- Deleting a web proxy deletes its counts.

## How far back the counts go

The counts come in whole UTC hours, and the range ends with the current hour: 24 hours means the current hour and the 23 before it. A request appears in the counts within about two minutes, so the current hour fills in as it passes.

On the Free plan, the counts reach back 24 hours. Pro, Business and Enterprise reach back 30 days ([How account plans work](/docs/billing/account-plans/#what-each-plan-includes)). While account plans do not apply to your account, every domain shows up to 30 days ([Plans open in stages](/docs/billing/account-plans/#plans-open-in-stages)).

## Troubleshooting

Every count is zero
: Check `hostnames` in the answer. An empty list means that no web proxy of yours is on the domain or under it ([Manage a website's web proxy](/docs/websites/proxy/)). Otherwise, no request reached those web proxies in the range, or their counts have not arrived yet. Ask for a longer range.

The newest requests are missing
: A request appears in the counts within about two minutes. Ask again a little later.

`402` with `entitlement_exceeded`
: Your plan shows the last 24 hours of traffic. Ask for `hours` of 24 or less, or move to a larger plan ([Choose or change your account plan](/docs/billing/change-account-plan/)).

`404` with `You have no route with ID 9 under example.com.`
: The `route_id` is not one of your web proxies, or its hostname is not the domain or under it. Take the ID from `hostnames`.

## Related

- [How web proxies work](/docs/proxies/web-proxies/)
- [Protect a website with the WAF](/docs/websites/waf/)
- [View DNS query statistics](/docs/websites/dns-query-statistics/)

## With the API

Read the last `hours` hours, from 1 to 720 (24 when you leave it out), for a domain and every name under it:

```bash
curl "https://api.coritan.com/api/v1/proxy/traffic?domain=example.com&hours=24" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

```json
{
  "domain": "example.com",
  "hours": 24,
  "since": "2026-09-14T15:00:00Z",
  "hostnames": [
    {"route_id": 41, "hostname": "example.com"},
    {"route_id": 42, "hostname": "shop.example.com"}
  ],
  "totals": {
    "requests": 18250,
    "blocked": 412,
    "bytes_in": 14965000,
    "bytes_out": 873400000,
    "status_2xx": 15980,
    "status_3xx": 1460,
    "status_4xx": 760,
    "status_5xx": 50,
    "websocket_connections": 0,
    "latency_avg_ms": 44
  },
  "series": [
    {"hour": "2026-09-14T15:00:00Z", "requests": 1210, "blocked": 31, "bytes_out": 57800000, "status_4xx": 52, "status_5xx": 0}
  ],
  "by_hostname": [
    {"route_id": 41, "hostname": "example.com", "requests": 14100, "blocked": 380, "bytes_out": 640200000, "status_5xx": 41},
    {"route_id": 42, "hostname": "shop.example.com", "requests": 4150, "blocked": 32, "bytes_out": 233200000, "status_5xx": 9}
  ]
}
```

`domain`
: The domain, such as `example.com`, or one hostname, such as `shop.example.com`, from 1 to 253 characters. Case and a trailing dot make no difference.

`hours`
: How many hours to cover, from 1 to 720. More than 24 needs the Pro plan or above while account plans apply to your account.

`route_id`
: Optional. One web proxy's route ID from `hostnames`, to narrow `totals` and `series` to its hostname. `hostnames` and `by_hostname` still list every hostname.

In the answer, `since` is the start of the oldest hour, and every time is UTC in ISO 8601. `hostnames` lists the domain first, then the rest by name. `totals` sums the range. `series` holds one entry per hour, oldest first, with zeros for an hour without traffic, so it always has `hours` entries. `by_hostname` lists every hostname with its sums, busiest first.

On the Free plan, `hours` above 24 answers `402` with `entitlement_exceeded`:

```json
{
  "detail": {
    "code": "entitlement_exceeded",
    "entitlement": "site_analytics",
    "limit": false,
    "used": 0,
    "upgrade": {"plan": "plan-pro", "addon": null},
    "message": "Your Free plan shows the last 24 hours of traffic. To see up to 30 days, upgrade to Pro."
  }
}
```

Ask again with `hours` of 24 or less. `upgrade.plan` is the plan that shows up to 30 days ([When you reach a limit](/docs/billing/account-plans/#when-you-reach-a-limit)). A `route_id` that is not yours, or not under `domain`, answers `404`, and `hours` outside 1 to 720 answers `422`.

## API

- `GET /api/v1/proxy/traffic`: Requests your web proxies served for a domain, by hour and by hostname (https://www.coritan.com/docs/api/reference/client/reverse-proxy/#op-get-api-v1-proxy-traffic)
