---
title: "OpenVibe.Report API · OpenVibe.Services"
canonical: "https://openvibe.services/docs/api/report"
updated: null
---

# OpenVibe.Report API · OpenVibe.Services

HTML: [OpenVibe.Report API · OpenVibe.Services](https://openvibe.services/docs/api/report)

# OpenVibe.Report API

Generated at 2026-11-13 06:25:48 UTC from [`openvibe-contracts v0.419.0`](https://github.com/OpenVibers/OpenVibe.Contracts/tree/v0.419.0) and [`openvibe-sdk v0.161.0`](https://github.com/OpenVibers/OpenVibe.SDK/tree/v0.161.0).

Server `https://openvibe.report`. 8 routes performing 3 capabilities. [OpenAPI 3.1 document](/docs/api/report.json).

  only routes apps can be granted (public, partner)  

### GET `/api/v1/ai/usage`

Read the AI meter across the network: the usage records and their roll-ups, in groups (day, site, model, system, paid\_by).

- Capabilities: [report.ai\_usage.read](/docs/capabilities/report.ai_usage.read)
- Visibility: internal
- Response: `application/json` [report.ai-usage-result@1](/docs/contracts/report.ai-usage-result)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.ai\_usage.read</strong> (internal): Read the AI meter across the network: the usage records and their roll-ups, in groups (day, site, model, system, paid\_by). The public totals (GET /api/v1/ai/usage/open) need no token at all.</p>

### GET `/internal/config`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `values` (query, required) — The new values, one member per key. The store validates them against the namespace schema; a secret-class value here is refused.
- `reason` (query, required) — Why the change is made; it is the revision's reason in the history.
- `merge` (query) — Merge into the active values instead of replacing them.
- `unset` (query) — Keys to remove from the new revision.
- Input: [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### GET `/internal/config/{namespace}`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `namespace` (path, required)
- `values` (query, required) — The new values, one member per key. The store validates them against the namespace schema; a secret-class value here is refused.
- `reason` (query, required) — Why the change is made; it is the revision's reason in the history.
- `merge` (query) — Merge into the active values instead of replacing them.
- `unset` (query) — Keys to remove from the new revision.
- Input: [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### POST `/internal/config/{namespace}`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `namespace` (path, required)
- Request body: `application/json` [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### PUT `/internal/config/{namespace}/secrets/{key}`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `namespace` (path, required)
- `key` (path, required)
- Request body: `application/json` [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### DELETE `/internal/config/{namespace}/secrets/{key}`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `namespace` (path, required)
- `key` (path, required)
- `values` (query, required) — The new values, one member per key. The store validates them against the namespace schema; a secret-class value here is refused.
- `reason` (query, required) — Why the change is made; it is the revision's reason in the history.
- `merge` (query) — Merge into the active values instead of replacing them.
- `unset` (query) — Keys to remove from the new revision.
- Input: [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### POST `/internal/config/{namespace}/test/{key}`

Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one

- Capabilities: [report.config.manage](/docs/capabilities/report.config.manage)
- Visibility: internal
- Parameters: - `namespace` (path, required)
- `key` (path, required)
- Request body: `application/json` [common.config-change@1](/docs/contracts/common.config-change)
- Response: `application/json` [common.config-namespace@1](/docs/contracts/common.config-namespace)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.config.manage</strong> (internal): Manage the configuration namespaces and secrets of OpenVibe.Report through openvibe-shared/config (D11): GET /internal/config lists the namespace summaries, GET /internal/config/:namespace returns one as common.config-namespace@1, POST applies common.config-change@1, and PUT /internal/config/:namespace/secrets/:key sets a secret with common.config-secret-put@1 (write-only; the answer is the marker) while DELETE removes it. POST /internal/config/:namespace/test/:key asks the service&#39;s tester to try a stored value with the provider on the server, answering { ok, message } in one line that never carries a secret (the owner&#39;s Setup tab). Only Network&#39;s admin proxy, acting for the owner, holds this capability; it is never grantable to apps. Each request carries the owner as actor, and the service audits every write with that actor and key, never a secret value.</p>

### POST `/internal/session-reports`

Write one agent session's report on OpenVibe.Report (the Agent Streams plan, S3).

- Capabilities: [report.session.write](/docs/capabilities/report.session.write)
- Visibility: first-party
- Request body: `application/json` [report.session-write-request@1](/docs/contracts/report.session-write-request)
- Response: `application/json` [report.session-write-result@1](/docs/contracts/report.session-write-result)
- Errors: [errors.problem@1](/docs/contracts/errors.problem) (application/problem+json)

 Description<p><strong>report.session.write</strong> (first-party): Write one agent session&#39;s report on OpenVibe.Report (the Agent Streams plan, S3). POST /internal/session-reports stores the report of a Codes task, an Actor task, a desk session or a session on a person&#39;s own machine, and answers the report&#39;s page. The route is idempotent per (source, task ref): the same session&#39;s task always answers the same report. The caller is a first-party service - Codes, Actor or Live - with a service token that holds this capability for the audience openvibe.report; Network grants it to exactly those principals. The body names the person the session was theirs, and a service may only write a report for the person it acts for. Every text field passes the house redactor before anything is stored: the raw transcript and secrets never reach the report.</p>
