---
title: "Calculate and save one report in the owner-authorized project"
method: POST
path: "/api/v1/project-reports"
---

# Calculate and save one report in the owner-authorized project

`POST /api/v1/project-reports`

## Request

- Base URL: `https://alpnai.com`
- URL: `https://alpnai.com/api/v1/project-reports`
- Auth: HTTP bearer

Compute and save an aggregate performance report in the fixed Projects destination authorized by the account owner. Uses the existing free or paid report allowance. Requires an active agent key and explicit owner write permission. Reuse request_id with identical content to retry within the same permission grant. No report reading, deletion, subscription or payment authorization. Send measurements without secrets. A repeated identical request consumes no additional report quota. Changing or re-enabling the grant creates a new request namespace. No automatic paid upgrade or overage. The successful response contains no private report history.

## Request body

- object
  - `request_id` string, required
  - `title` string, required
  - `input` object, required: Recorded attempts, not prompts or secrets. Identical rows count as separate attempts. All three analysis tools accept this same input. The runtime validator additionally enforces six-decimal micro-USD precision, the same task_id belonging to one workflow, one workflow when monthlyTasks is given, and UTF-16 length limits. HTTP body limit: 512000 UTF-8 bytes.
    - `runs` object[], required
      - `task_id` string, required: Nonempty, no control characters or surrounding whitespace. The engine additionally enforces at most 128 UTF-16 code units.
      - `workflow` string, required: Nonempty, no control characters or surrounding whitespace. The engine additionally enforces at most 80 UTF-16 code units.
      - `variant` 'baseline' | 'candidate', required
      - `cost_usd` number, required: USD cost of this attempt. At most six decimal places; the engine verifies whole micro-USD using floating-point tolerance. No multipleOf keyword is used, to avoid rejecting valid JSON decimals.
      - `success` boolean, required
      - `latency_ms` number: Recorded attempt duration in milliseconds; decimals are accepted. Omit if not measured.
    - `config` object
      - `minSamples` integer
      - `minSuccessRate` number
      - `maxSuccessRateDrop` number
      - `maxP95LatencyMs` number
      - `monthlyTasks` integer: Baseline logical tasks launched per month; the engine requires exactly one workflow if supplied.

## Response `200`

Saved or replayed report identifier

- object
  - `id` string, required
  - `replayed` boolean, required
  - `saved` unknown, required
  - `persistence` 'computed_summary', required
  - `payment_authorized` unknown, required

## Other responses

- `400`: Invalid measurements or request
- `401`: Missing or revoked agent key
- `403`: Owner grant missing or revoked
- `409`: Report quota exhausted, replay conflict or deleted report
- `413`: Request too large
- `503`: Service temporarily unavailable; retry with the same request ID and content

---

[API](https://skmtc.dev/alpnai/apis/alpnai-agent-api.md) · [All operations](https://skmtc.dev/alpnai/apis/alpnai-agent-api/llms.txt) · [OpenAPI document](https://skmtc.dev/alpnai/apis/alpnai-agent-api/revisions/ab20b858b8d4?raw)
