### Preview adding or removing traffic or time

`POST /api/v1/users/bulk-traffic/preview`

Read-only. Shows each subscriber's remaining traffic and online time before and after a signed change, using the same counters bulk-add-traffic and bulk-add-time write.

- Authentication: manager session (JWT) or API token
- Permission: `prm_users_add_traffic` (Add traffic)
- Risk: danger
- Rate limit bucket: `t_mutate`

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `ids` | body | array | yes | Subscriber ids, at most 1000. |
| `traffic_mb` | body | integer | no | Signed MB. Negative removes. |
| `minutes` | body | integer | no | Signed minutes. Negative removes. At least one of the two must be non-zero. |

#### Request

```json
{
  "ids": [4711, 4712],
  "traffic_mb": -5120
}
```

#### Response — 200 OK

```json
{
  "data": {
    "rows": [
      { "id": 4711, "username": "ahmed", "profile_name": "Home-10M",
        "bytes_before": 2147483648, "bytes_after": 0,
        "seconds_before": null, "seconds_after": null,
        "clamped": true, "unlimited": false },
      { "id": 4712, "username": "mona", "profile_name": "Unlimited",
        "bytes_before": null, "bytes_after": null,
        "seconds_before": null, "seconds_after": null,
        "clamped": false, "unlimited": true,
        "blocked": true, "reason": "no_traffic_quota",
        "message": "This subscriber's plan doesn't meter this — there is no balance to add to or take from." }
    ],
    "affected": 1,
    "clamped": 1,
    "blocked": 1
  }
}
```

#### Note

null means the plan does not meter that dimension. clamped means a removal would stop at zero: a balance never goes below zero.

