# `Bourse.WS.SpecConfig`
[🔗](https://github.com/ZenHive/bourse/blob/main/lib/bourse/ws/spec_config.ex#L1)

Merges v4.1.0 `websocket.*` spec slices with hand-maintained WS overrides.

Resolved spec fields win; unresolved or absent fields fall back to hand
config without guessing. Subscription channel templates remain T97-owned.

# `build`

```elixir
@spec build(String.t()) :: map() | nil
@spec build(Bourse.Exchange.t()) :: map() | nil
```

Builds the effective WS config map for an exchange, or nil when unsupported.

`hand` carries subscription patterns and hand-only URL/auth detail; spec slices
override heartbeat and auth pattern selection when resolved.

# `build`

```elixir
@spec build(String.t(), map() | nil, map() | nil) :: map() | nil
```

# `hand_bases`

```elixir
@spec hand_bases() :: %{required(String.t()) =&gt; map()}
```

Hand-maintained bases keyed by exchange id (subscription + URL/auth detail).

---

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