> For the full page index, fetch https://echonova.ai/llms.txt

# Read your API activity

Open Developers Activity, read the Overview, Trends, Explore and Logs tabs, and know exactly which requests and credits the page counts.

The Activity page shows what your API keys did and the credits they spent.
It counts only developer API usage: calls to `/v1` made with an API key, and
the credits charged to an API key. That is **Text to Speech**, **Speech
to Text** and **Sound Cleaning**. You see credits, requests, speech and audio,
split by API key, service and voice. Use it to find the key that spends the
most, the day a spike began, and the requests that failed.

Portal pages such as the playground, and agents, do not show on Activity.
That covers Sada voice and chat, EchoReader, voice cloning, the knowledge base,
the agent builder and database tools. Their credits show in your Credits
history.

## What you need

- An EchoNova account and a workspace with at least one API key. See
  [Get an API key](/docs/developers/get-an-api-key).
- The workspace owner's access, which includes the `developer_api.view`
  permission.
- Some activity. Until a key makes a request, every card reads 0 and the
  charts are empty.

## Open Activity

Open **Developers** in the portal and select the **Activity by key** quick
link, or go to `/developers/activity`. The page opens on the **Overview** tab
with the **30 days** period.

## The header

The header controls every tab at once. Each choice is saved in the page
address, so a reload keeps your view.

| Control        | What it does                                                                                                                                                                                                                                                                                                                                                                                        |
| -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Time zone chip | A label, not a button. It shows your browser's offset, for example `GMT+4`. Days, weeks and months group in your browser's zone. There is no switch to UTC.                                                                                                                                                                                                                                         |
| **Filter**     | Opens a panel with **API key**, **Service** and **Voice**. Each is set to **All** until you pick one. A chip appears for each filter you set.                                                                                                                                                                                                                                                       |
| **Period**     | **7 days**, **30 days**, **90 days** or **1 year**.                                                                                                                                                                                                                                                                                                                                                 |
| **Export CSV** | Downloads daily totals per API key, service and voice as a CSV file named `echonova-activity-<from>-to-<to>.csv`, with the columns `date`, `api_key`, `key_prefix`, `service`, `voice`, `requests`, `failed`, `units`, `unit`, `credits` and `usd_at_plan_rate`. `unit` is `minutes` for Speech to Text and Sound Cleaning, and `characters` for Text to Speech. The toast says **CSV downloaded**. |
| **Copy link**  | Copies a link to this exact view: tab, period and filters. The zone is not in the link; whoever opens it sees days in their own browser's zone. The toast says **Link to this view copied**.                                                                                                                                                                                                        |

Select **Clear all** in the filter panel to remove every filter, or select a
chip to remove one.

## Overview

The **Overview** tab answers where the credits went in the period.

- Five cards: **Credits used**, **Requests**, **Speech generated**, **Audio
  processed** and **Success rate**. Each compares with the previous period of
  the same length. **Credits used** also shows the cost as **≈ $x at your {plan}
  rate**, for example **≈ $12.40 at your Growth rate**, or **≈ $x at your trial
  rate** on a trial. The line is hidden when there is no rate.
- **Audio processed** counts audio sent to Speech to Text and Sound Cleaning.
  Generated speech counts as characters, not audio. Under
  one minute it shows in seconds, for example **9 s**.
- A bar chart of the selected card by day. Use **Group by** to split it by
  **Service**, **API key** or **Voice**. Hover a bar for the breakdown. Select
  a bar to open that day on the **Logs** tab.
- **Top API keys** and **Top voices**, ranked by credits. Select a key to
  filter every tab. A key with its last 4 characters stored shows as `ek_…` and
  those 4 characters, for example `ek_…c21d`. A key without them stored shows
  its prefix.
- **Failed requests**, by API key, with the key that has the highest failure
  rate. Failed requests are never charged.
- **Plan credits this cycle**. The plan line shows the whole plan: the credits
  granted, the credits used by every product and the period end. Every product
  shares the plan, so this card includes portal and agent use, while every
  other figure on the page is API usage only. It shows only when the workspace
  has a plan. Each key's use of its own credit limit shows when that key has a credit limit. A
  key at 80% or more of its limit shows **Near limit**.

## Trends

The **Trends** tab compares this period with the one before it, day by day.

1. Pick a measure: **Credits**, **Requests**, **Characters** or **Minutes**.
2. Read the line chart. **This period** and **Previous period** share one axis.
3. Read **Biggest movers**, the keys, services or voices that changed most.
   Use **Show** to switch between **All**, **API keys**, **Services** and
   **Voices**. Select a row to filter the **Overview**.

A key, service or voice with no activity in the previous period shows **new**.

## Explore

The **Explore** tab builds your own chart. Set these controls:

| Control        | Choices                                                                                 |
| -------------- | --------------------------------------------------------------------------------------- |
| **Measure**    | **Credits**, **Spend ($)**, **Requests**, **Characters**, **Audio minutes**, **Errors** |
| **Group by**   | **API key**, **Service**, **Voice** or **None**. **Then by** adds a second split.       |
| **Per**        | **Day**, **Week**, **Month** or **None (ranking)**                                      |
| **Show**       | **Top 3**, **Top 5** or **Top 8**; the rest is grouped as **Other**                     |
| **Chart type** | **Bars**, **Lines** or **Dots**                                                         |

Turn on **Running total** for a cumulative line. The **Try:** presets, for
example **Spend per key, weekly**, set the controls for you. A **Data table**
under the chart lists the same numbers.

## Logs

The **Logs** tab lists the requests behind the numbers, 25 per page, with
**Previous** and **Next**. It follows the header filters and the period. Select
a day bar on the **Overview** to see only that day. Turn on **Failed only** to
hide the successful ones. Pick **No voice** in the **Voice** filter to see only
requests that used no voice. Paste an `X-Request-Id` into **Find by request ID**
to see that call from the last 365 days, whatever the period and filters. Clear
the box to go back. The line above the list counts the requests, for
example **12 requests**. It ends with **· logs keep 365 days** only when the
period is **1 year**.

| Column         | What it shows                                                                                                                                      |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Time**       | Date and time of the request.                                                                                                                      |
| **API key**    | The key's name.                                                                                                                                    |
| **Endpoint**   | The method and path, for example `POST /v1/text-to-speech/sync`.                                                                                   |
| **Status**     | The status your client received. A successful call shows `200`, and so does an accepted asynchronous job. A failed request shows its exact status. |
| **Credits**    | The credits the request was billed.                                                                                                                |
| **Time taken** | How long the API took to answer.                                                                                                                   |

Select a row to expand it:

| Field            | What it shows                                                                                |
| ---------------- | -------------------------------------------------------------------------------------------- |
| **Request id**   | The value of the `X-Request-Id` header on the response. Quote it when you contact support.   |
| **Service**      | **Text to Speech**, **Speech to Text** or **Sound Cleaning**.                                |
| **Voice**        | The voice used, or **No voice**.                                                             |
| **Billed**       | Characters or minutes, and credits.                                                          |
| **errorMessage** | For a failed request, the message your client received. **Nothing was charged.** follows it. |

Every API response carries an `X-Request-Id` header. Log it on your side and
look it up here.

## What counts as a request

Activity counts every call to `/v1` made with a known API key, whatever the
method and whatever the answer. That includes `GET` and `DELETE` calls, such
as polling a job or listing voices. `GET` calls charge no credits.

- Every call to `/v1` with a known key: `200`, `402`, `403` for a scope or a
  plan check, `404`, `415`, `422`, the first per-key `429` of each limit
  window and `4xx` or `5xx` after the key is accepted.
- The credits charged to an API key, for Text to Speech, Speech to Text and
  Sound Cleaning.

Portal runs and agent usage are not requests and have no rows. Credits they
spend show in [Credits history](/docs/account/usage), not here.

Older rows can still show `201` for a successful `POST` until they expire after 365 days.

A row records the status your client received. A successful call shows `200`,
and an accepted asynchronous job shows `200` too.

A synchronous call that fails is refunded in the same hour, so the credits net
out. An asynchronous job that fails later is refunded too, but its log row
keeps `200`, the status your client received when the job was accepted.

## What is not counted

- Any `401`: a missing or malformed `Authorization` header, an unknown,
  disabled or deleted key, or a closed workspace. EchoNova cannot tell which
  workspace it belongs to.
- The per-IP `429` that fires before the key is known.
- Any later per-key `429` in the same limit window, after the first one.
- A body rejected before the key is checked: `413` for a JSON body over
  100 KB, and `400` for a body that is not valid JSON.
- Portal runs, such as the playground, and agent usage: Sada voice and chat,
  EchoReader, voice cloning, the knowledge base, the agent builder and database
  tools. They have no rows and add no credits to the page. See
  [Credits history](/docs/account/usage).

The credits of a period equal the credit history's API key charges minus
refunds for that period. The plan card is the one exception: it shows the whole
plan.

## Limits

| Limit             | Value                                                                              | Applies to                |
| ----------------- | ---------------------------------------------------------------------------------- | ------------------------- |
| History start     | The day this page shipped. Earlier activity is not backfilled.                     | Charts and totals         |
| Daily totals kept | 800 days                                                                           | Overview, Trends, Explore |
| Request log rows  | 365 days                                                                           | **Logs** tab              |
| Rows per page     | 25                                                                                 | **Logs** tab              |
| Periods           | 7 days, 30 days, 90 days or 1 year                                                 | The header                |
| Recorded per row  | Method, path, status, time taken, key, service, voice, billed units, error message | Every log row             |
| Not recorded      | Request body, text, audio, headers, query string, client IP address                | Every log row             |

## FAQ

### Why is my total lower than I expected?

History starts the day this page shipped. Earlier credits are not shown. Also
check the **Filter** chips under the header. Every call counts as a
request, but only charged calls add credits, so a script that mostly polls adds
requests and no credits.

### Why does a failed job show a success status?

The API accepted the job and answered `200`, so the row keeps that status.
When the job fails later, its credits are refunded and the totals net out, but
the row does not change.

### Where are my 401 requests?

They are not counted. A `401` means the key was missing, malformed, unknown,
disabled or deleted, or the workspace is closed, so there is no workspace to
show it in.

### Does the page include the portal or agents?

No. Activity shows API key usage only. Portal pages such as the playground, and
agents, do not show here. Their credits show in
[Credits history](/docs/account/usage). The plan card still shows the
whole plan, because every product shares it.

### Which time zone does the page use?

Your browser's. The chip beside **Filter** shows its offset, for example
`GMT+4`, and days group in that zone. There is no UTC switch, and the zone is
not part of a copied link.

### Who can see Activity?

The workspace owner, whose role has the `developer_api.view` permission.

## Related

- [Read the request log](/docs/developers/request-logs)
- [Credits](/docs/developers/credits)
- [Rate limits](/docs/developers/rate-limits)
- [Errors](/docs/developers/errors)
