---
title: "HTTP requests across all your apps"
method: GET
path: "/client/apps/requests"
tags: ["Apps"]
---

# HTTP requests across all your apps

`GET /client/apps/requests`

## Request

- Base URL: `https://api.roar-ai.com`
- URL: `https://api.roar-ai.com/client/apps/requests`
- Auth: HTTP bearer

The per-app request feed (`GET /client/services/{id}/requests`) for every app you can see at once, each row naming its app. The first page also carries `summary` (the window's totals), `facets` (counts per app, status class, method and busiest path — over the window, not narrowed by the filters) and `series` (requests per hour, or per day past two days — narrowed by the filters). Filter with `since`/`until` (ISO timestamps), `band` (`errors`, `2xx`, `3xx`, `4xx`, `5xx`), `appId`, `method`, `path` (exact, as listed) or `requestId` (which searches everything held and ignores the rest). Keyset-paginated: pass `nextCursor` back as `cursor`. Requires `apps:read`.

## Query parameters

- `since` string, date-time
- `until` string, date-time
- `band` 'all' | 'errors' | '2xx' | '3xx' | '4xx' | '5xx'
- `appId` string, uuid
- `method` string
- `path` string
- `requestId` string
- `limit` integer
- `cursor` string
- `summaryOnly` '1'

## Response `200`

Requests, newest first

- ClientAppRequestPage
  - `retentionDays` integer, required: How many days of requests are kept. Older rows are deleted, so a window reaching further back returns no more.
  - `data` object[], required
    - `appId` string, uuid, required
    - `appName` string, required
    - `serviceId` string, uuid, required
    - `at` string, date-time, required
    - `method` string, required
    - `path` string, required: Query parameter names kept, every value removed
    - `status` integer, required
    - `durationMs` integer, nullable, required: Null when not reported, or when the response was incomplete
    - `incomplete` boolean, required: The response stopped before it finished (the visitor left, or the app broke off mid-response). The status is the one already sent; there is no duration.
    - `bytes` integer, nullable, required
    - `host` string, nullable, required
    - `requestId` string, nullable, required: The `cf-ray`; null when the node did not report one
    - `blocked` boolean, required: Stopped by the security rules before reaching the app — a scanner or an attack. Listed only with `band=blocked`, and never counted as a request or an error.
    - `reachedApp` boolean, required: False when the request never reached the app: it did not answer, or the caller gave up first. Such a row has no duration or size.
    - `appStatus` integer, nullable, required: What the app answered, when the caller got something else (`status`) — the app finished after the caller had already been cut off. Null otherwise.
  - `nextCursor` string, nullable, required: Pass back as `cursor` for older requests; null on the last page
  - `summary` ClientAppRequestsSummary, required
    - `blocked` integer, required: Stopped by the security rules before reaching the app — scanners and attacks. In none of the other counts.
    - `requests` integer, required
    - `appErrors` integer, required: Status 500–599: the app broke
    - `badRequests` integer, required: Status 400–499: mostly crawlers on a public app
    - `p95DurationMs` integer, nullable, required: Over requests that finished with a reported duration (incomplete ones are left out); null when none had one
    - `p50DurationMs` integer, nullable, required: The median over the same requests as p95DurationMs; null when none had a reported duration
  - `facets` object, nullable: Counts over the window, not narrowed by the filters — first page only
    - `byApp` object[], required
      - `appId` string, uuid, required
      - `requests` integer, required
      - `appErrors` integer, required
    - `byStatus` object, required
      - `2xx` integer, required
      - `3xx` integer, required
      - `4xx` integer, required
      - `5xx` integer, required
      - `blocked` integer, required: Stopped by the security rules; beside the classes, never inside them
    - `byMethod` object[], required
      - `method` string, required
      - `requests` integer, required
    - `byPath` object[], required: The ten busiest paths
      - `path` string, required
      - `requests` integer, required
      - `appErrors` integer, required
      - `badRequests` integer, required
  - `series` object[], nullable: Requests per hour (per day past two days) over the FILTERED list — first page only
    - `bucket` string, date-time, required
    - `requests` integer, required
    - `appErrors` integer, required
    - `badRequests` integer, required

## Other responses

- `403`: Key lacks apps:read
- `404`: No such app

---

[API](https://skmtc.dev/roar-ai/apis/roar-ai-api.md) · [All operations](https://skmtc.dev/roar-ai/apis/roar-ai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/roar-ai/apis/roar-ai-api/revisions/37e4d0d5a7fe?raw)
