### List invoices across subscribers

`GET /api/v1/billing/invoices`

Every invoice the caller may see, in one list, with filters for reconciling a period. A caller without tenant-wide visibility sees only invoices belonging to subscribers in their own manager subtree.

- Authentication: manager session (JWT) or API token
- Permission: `prm_billing` (Billing & invoices)
- Risk: write

#### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `filter[status]` | query | string | no | Payment status. |
| `filter[username]` | query | string | no | Narrow to one subscriber by username. |
| `filter[date_from]` | query | string | no | Inclusive lower bound. A malformed value is a 400, not an ignored filter. |
| `filter[date_to]` | query | string | no | Inclusive upper bound. |
| `filter[amount_min]` | query | number | no | Inclusive lower amount bound. |
| `filter[amount_max]` | query | number | no | Inclusive upper amount bound. |

#### Response — 200 OK

```json
{
  "data": [
    {
      "id": 51204,
      "user_id": 4711,
      "username": "ahmed",
      "invoice_number": "INV-2026-000512",
      "type": "activation",
      "amount": 171.00,
      "discount": 0.00,
      "vat": 14.00,
      "status": "paid",
      "description": "Home 20M (activate)",
      "payment_method": "manager_balance",
      "due_date": "2026-09-20 00:00:00",
      "paid_on": "2026-09-20 09:15:02",
      "created_by_manager_id": 41,
      "created_by_name": "cairo-reseller",
      "created_at": "2026-09-20 09:15:02"
    }
  ],
  "meta": { "page": 1, "page_size": 50, "total": 1284, "has_next": true }
}
```

#### Note

username is populated only on this cross-subscriber list, which joins the subscriber table. The per-subscriber list and the single-invoice fetch leave it empty, because there the subscriber is already known.

