# WorldIPTV Compare API (lite)

## `GET /api/v1/compare`

Query params:

| Param | Values | Notes |
|-------|--------|-------|
| sport | yes \| soft \| no | sports preference |
| uhd | 0 \| 1 | want 4K |
| budget | number | max monthly (local currency) |
| devices | 1 \| 2 \| 3 | simultaneous screens |
| platform | firestick \| smart_tv \| phone \| other | for reasons |
| region | fr \| us \| uk \| ca \| au \| de \| es \| it \| other | fine region |
| regionBucket | eu \| us \| ar | optional override |
| currency | EUR \| USD \| GBP \| CAD \| AUD | defaults from bucket |

### Response (hard rules)

- `top3[0]` **always** `kind: "house"`, `pinned: true` (WorldIPTV). Score picks the house SKU only.
- Ranks 2–3: `kind: "sponsored"` with Disclosure (EN/FR/AR) only — empty inventory → house-only TOP1.
- Never invent sponsors. Legal whitelist reserved for later (file stays empty).
- `sponsored[]` inventory is also returned separately (may be empty).
- `whatsapp`: `https://wa.me/447307410512` (use after results).
- No AggregateRating, no public M3U.

### Open data (prefer for bots)

- [/data/plans.json](/data/plans.json)
- [/data/plans.csv](/data/plans.csv)
- [/open-data](/open-data)
- [/data/legal-operators.json](/data/legal-operators.json)

CORS: `Access-Control-Allow-Origin: *` on GET. Soft rate-limit ~60 req/min/IP.