---
title: "Report a finished meeting recording for metering [write]"
method: POST
path: "/meeting-recordings"
---

# Report a finished meeting recording for metering \[write\]

`POST /meeting-recordings`

## Request

- Base URL: `https://api.agentsky.dev/v1`
- URL: `https://api.agentsky.dev/v1/meeting-recordings`
- Auth: none declared

Books one charge for one recording, on the two bases the supplier charges us on. bot_seconds is how long the recorder held a seat — first to last status change, including time spent waiting to be admitted — billed at $1.00 per hour. recorded_seconds is what was actually captured, capture start to capture end, billed at $0.30 per hour; it is not a bot lifetime and not a running total for the meeting. Neither basis is derived from the other and both are required. The 60-second minimum applies to each basis separately, not to their sum. A report naming error_code zeroes the transcription basis but still owes the seat, because the supplier still charged for it; only a booking where neither basis ran costs nothing. The reporting account is the account charged. A recording is identified by meeting_id and bot_id together: reporting it again returns the booked terms with 200 and charges nothing further.

## Request body

- object
  - `meeting_id` string, required: The meeting, in the reporter's own namespace
  - `bot_id` string, required: The recorder instance that produced this recording
  - `bot_seconds` number, required: Seconds the recorder held a seat, the wait included — the basis the seat charge bills on. 0 means it never ran. Over 86400 is refused rather than truncated
  - `recorded_seconds` number, required: Seconds actually captured — the only basis transcription bills on. Not a bot lifetime; bot_seconds is that. Over 86400 is refused rather than truncated
  - `error_code` string: Why this recording is not billable. Its presence alone forces a $0 receipt
  - `session_id` string: A session to attribute the charge to; omit when the reporter has no session

## Response `200`

Already reported; the booked terms, unchanged

- object
  - `recording` object, required
    - `meeting_id` string, required
    - `bot_id` string, required
    - `idempotency_key` string, required: meeting:<meeting_id>:<bot_id>
    - `recorded` boolean, required: False when this recording was already booked
    - `billed_bot_seconds` number, required: Seat seconds the price was computed on, after that basis's own 60s minimum
    - `billed_recorded_seconds` number, required: Recorded seconds the price was computed on, after that basis's own 60s minimum
    - `cost_usd` number, required
    - `error_code` string, nullable, required

## Other responses

- `201`: Booked
- `default`: Error — { error: { code, message, request_id } }

## Changes

- **2026-11-02** `e5e8f0229a99`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/agentsky/apis/agentsky-developer-api/changes/meeting-recordings/post.md)

---

[API](https://skmtc.dev/agentsky/apis/agentsky-developer-api.md) - [All operations](https://skmtc.dev/agentsky/apis/agentsky-developer-api/llms.txt) - [OpenAPI document](https://skmtc.dev/agentsky/apis/agentsky-developer-api/revisions/8280a065ef6a?raw)
