# `TruelayerClient.HTTP`
[🔗](https://github.com/iamkanishka/truelayer_client/blob/v1.0.0/lib/truelayer_client/http.ex#L1)

Instrumented HTTP client wrapping `Req`.

Handles:
  * JSON encoding/decoding
  * RFC 7807 problem+json error body parsing
  * `Tl-Trace-Id` and `Tl-Should-Retry` response header extraction
  * Telemetry events (`:start`, `:stop`, `:exception`)
  * TLS 1.2+ enforcement via transport options

# `build_client`

```elixir
@spec build_client(TruelayerClient.Config.t()) :: Req.Request.t()
```

Build a `Req.Request` base client from a `TruelayerClient.Config`.

# `form_post`

```elixir
@spec form_post(Req.Request.t(), String.t(), map()) ::
  {:ok, map()} | {:error, TruelayerClient.Error.t()}
```

Execute an `application/x-www-form-urlencoded` POST request.

Used exclusively for OAuth2 token-endpoint calls.

# `json_request`

```elixir
@spec json_request(Req.Request.t(), TruelayerClient.Config.t(), keyword()) ::
  {:ok, term()} | {:error, TruelayerClient.Error.t()}
```

Execute a JSON request.

Returns `{:ok, decoded_body}` for 2xx responses or
`{:error, %TruelayerClient.Error{}}` for errors.

---

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