# `CCXT.Signing.Custom`
[🔗](https://github.com/ZenHive/ccxt_client/blob/main/lib/ccxt/signing/custom.ex#L1)

Custom signing escape hatch for exchanges with non-standard authentication.

Delegates to a user-provided module that implements `CCXT.Signing.Behaviour`.

## Configuration

    signing: %{
      pattern: :custom,
      custom_module: MyApp.CustomSigners.MyExchange
    }

## Validation

    {:ok, _} = CCXT.Signing.Custom.validate_module(MyApp.CustomSigners.MyExchange)

See `CCXT.Signing.Behaviour` for the full contract and available helpers.

# `sign`

```elixir
@spec sign(CCXT.Signing.request(), CCXT.Credentials.t(), CCXT.Signing.config()) ::
  CCXT.Signing.signed_request()
```

Delegates signing to the custom module specified in config.

Raises `ArgumentError` if `:custom_module` is not specified or invalid.

# `validate_module`

```elixir
@spec validate_module(module()) :: {:ok, module()} | {:error, String.t()}
```

Validates that a module implements the signing contract (`sign/3`).

Returns `{:ok, module}` if the module exports `sign/3`, or
`{:error, reason}` with an actionable message.

---

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