# Filtering

Compose strict scalar and repeated-array filters without changing their meaning.

## Query encoding

| Kind | Examples | Rule |
| --- | --- | --- |
| Scalar | query, sort, direction, limit | Send at most once |
| Repeated array | roles, locations, tools | Repeat the query key |
| Range | experience_min, compensation_min | Minimum must not exceed maximum |
| Location selector | country:GB, region:EMEA | Use the documented prefix |
| Cursor | cursor | Opaque and bound to the filters |

## Repeated filters

### cURL

```shell
curl "https://api.luranta.com/v0/jobs?roles=software-engineering&roles=data-engineering&locations=country%3AGB" \
  --header "Authorization: Bearer $LURANTA_API_KEY"
```

### TypeScript

```ts
await luranta.jobs.list({
  roles: ["software-engineering", "data-engineering"],
  locations: ["country:GB"],
})
```

### Python

```python
luranta.jobs.list({
    "roles": ["software-engineering", "data-engineering"],
    "locations": ["country:GB"],
})
```

> **Validation is strict:** Unknown parameters, duplicate scalars, invalid values, conflicting ranges and oversized arrays return 400 Problem Details.
