# `Tinkex.API.URL`
[🔗](https://github.com/North-Shore-AI/tinkex/blob/v0.4.0/lib/tinkex/api/url.ex#L1)

URL building and query parameter management for Tinkex API requests.

Handles:
- URL construction from base URL and path
- Query parameter normalization and merging
- Query string encoding/decoding

# `build_url`

```elixir
@spec build_url(String.t(), String.t(), map(), map()) :: String.t()
```

Builds a complete URL from base URL, path, and query parameters.

Merges query parameters in priority order (later overrides earlier):
1. Default query from config
2. Query parameters embedded in the path
3. Explicit request query parameters

## Examples

    iex> build_url("https://api.example.com", "/v1/test", %{}, %{"key" => "value"})
    "https://api.example.com/v1/test?key=value"

    iex> build_url("https://api.example.com", "/v1/test?existing=1", %{}, %{"new" => "2"})
    "https://api.example.com/v1/test?existing=1&new=2"

# `normalize_query_params`

```elixir
@spec normalize_query_params(nil | map() | keyword()) :: map()
```

Normalizes query parameters from various input formats into a map.

Accepts:
- nil (returns empty map)
- Map with string or atom keys
- Keyword list

Filters out nil values and ensures all keys/values are strings.

## Examples

    iex> normalize_query_params(nil)
    %{}

    iex> normalize_query_params(%{key: "value", nil_key: nil})
    %{"key" => "value"}

    iex> normalize_query_params([key: "value", other: 123])
    %{"key" => "value", "other" => "123"}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
