TL;DR: elasticsearch-py 8 renamed timeout to request_timeout. Change Elasticsearch(hosts, timeout=30) to Elasticsearch(hosts, request_timeout=30) and the TypeError goes away.

```text
TypeError: Elasticsearch.__init__() got an unexpected keyword argument 'timeout'
```

## Fix it

1. Rename the argument: request_timeout=30. Expected: constructor accepts it.
2. Grep for other v7-isms in the same call: http_auth= becomes basic_auth=, connection_class= goes away. Expected: no more TypeErrors.
3. Verify with a cheap call: es.info(). Expected: cluster info dict.
4. Pin elasticsearch>=8 in requirements so a fresh install does not pull v7.

## When this applies
- The TypeError names timeout and elasticsearch is 8.x.

## When it doesn't
- elasticsearch is 7.x: timeout= is correct there; something else is wrong.
- The error names a different argument: check the v8 migration guide for its rename.

## Compatibility
- elasticsearch-py >= 8.0.

## Why it happens
The v8 rewrite renamed several constructor arguments for consistency. timeout was ambiguous (connect vs request), so it became the explicit request_timeout.

## Edge cases
- request_timeout can also be a per-request kwarg on search/get calls, which is often the better place for it.
- max_retries and retry_on_timeout still exist; only the name timeout was taken.
