# POST /api/v1/ad/watch-report — 上报激励视频观看时长

> 所属:Ad 组（前缀 `/api/v1/ad`） | 鉴权:Bearer | 限流:同 IP ≤120 次/分 | [← 返回 API 索引](../README.md)

客户端在激励视频关闭（onAdClose）后上报本次实际观看秒数，服务端累计到当日总时长。当前产品只保留每日 500 次上限，DAILY_AD_WATCH_SECONDS_LIMIT=0 表示时长闸不启用；该接口仍保留用于旧客户端兼容和排查观看时长。

## 入参

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `seconds` | int | ✅ (≥0) | 本次观看秒数，服务端夹 [0, MAX_SINGLE_WATCH_SECONDS] |

Mock 入参:
```json
{
  "seconds": 28
}
```

## 出参

响应 `200`:`WatchReportOut`

| 字段 | 类型 | 说明 |
|---|---|---|
| `watched_seconds_today` | int | 今日累计观看秒数 |
| `watch_seconds_limit` | int | 每日上限（秒）；0 表示当前未启用时长闸 |
| `watch_seconds_remaining` | int | 今日剩余可观看秒数 |

Mock 出参:
```json
{
  "watched_seconds_today": 128,
  "watch_seconds_limit": 0,
  "watch_seconds_remaining": 0
}
```

## 错误码
- `401` 未鉴权 / token 失效
- `422` `seconds` 缺或为负

## 说明
- 鉴权靠 Bearer，`user_id` 取自 JWT（不信 body）
- 后端只做累计 + 上限裁切，不据此发奖（发奖靠 S2S 回调）
- `watch_seconds_limit=0` 时客户端不据此拦截，按每日 500 次上限走
