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

TrueLayer Data API v1.

Requires a user-delegated **Data-scoped** token obtained via
`TruelayerClient.Auth.exchange_code/3` with Data scopes.

Data tokens and Payments tokens are strictly isolated — a Data token
cannot authorise a Payments API call and vice versa.

## Lazy streaming

`transaction_stream/3` returns a lazy `Stream.t()` backed by `Stream.resource/3`.
This allows functional composition without loading all transactions into memory:

    client
    |> TruelayerClient.Data.transaction_stream(account_id,
         from: ~U[2024-01-01 00:00:00Z], to: ~U[2024-03-31 23:59:59Z])
    |> Stream.filter(&(&1["transaction_type"] == "CREDIT"))
    |> Stream.map(& &1["amount"])
    |> Enum.sum()

# `extend_connection`

```elixir
@spec extend_connection(TruelayerClient.t(), map()) ::
  :ok | {:error, TruelayerClient.Error.t()}
```

Extend an existing connection's consent period.

# `generate_direct_auth_link`

```elixir
@spec generate_direct_auth_link(TruelayerClient.t(), map()) ::
  {:ok, map()} | {:error, TruelayerClient.Error.t()}
```

Generate a direct bank authentication link.

# `generate_reauth_link`

```elixir
@spec generate_reauth_link(TruelayerClient.t(), map()) ::
  {:ok, map()} | {:error, TruelayerClient.Error.t()}
```

Generate a re-authentication link for an existing connection.

# `get_account`

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

Get a single account (GET /data/v1/accounts/{id}).

# `get_account_balance`

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

Get the balance for an account (GET /data/v1/accounts/{id}/balance).

# `get_card`

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

Get a single card (GET /data/v1/cards/{id}).

# `get_card_balance`

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

Get the balance for a card (GET /data/v1/cards/{id}/balance).

# `get_card_pending_transactions`

```elixir
@spec get_card_pending_transactions(TruelayerClient.t(), String.t(), keyword()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get pending transactions for a card.

# `get_card_transactions`

```elixir
@spec get_card_transactions(TruelayerClient.t(), String.t(), keyword()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get settled transactions for a card.

# `get_connection_meta`

```elixir
@spec get_connection_meta(TruelayerClient.t()) ::
  {:ok, map()} | {:error, TruelayerClient.Error.t()}
```

Get connection metadata for the current token (GET /data/v1/me).

# `get_direct_debits`

```elixir
@spec get_direct_debits(TruelayerClient.t(), String.t()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get direct debits for an account.

# `get_pending_transactions`

```elixir
@spec get_pending_transactions(TruelayerClient.t(), String.t(), keyword()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get pending transactions for an account.

# `get_standing_orders`

```elixir
@spec get_standing_orders(TruelayerClient.t(), String.t()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get standing orders for an account.

# `get_transactions`

```elixir
@spec get_transactions(TruelayerClient.t(), String.t(), keyword()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

Get settled transactions for an account (GET /data/v1/accounts/{id}/transactions).

## Options

  * `:from` - `DateTime` lower bound
  * `:to` - `DateTime` upper bound

# `get_user_info`

```elixir
@spec get_user_info(TruelayerClient.t()) ::
  {:ok, map()} | {:error, TruelayerClient.Error.t()}
```

Get identity info for the authenticated user (GET /data/v1/info).

# `list_accounts`

```elixir
@spec list_accounts(TruelayerClient.t()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

List all bank accounts (GET /data/v1/accounts).

# `list_cards`

```elixir
@spec list_cards(TruelayerClient.t()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

List all cards (GET /data/v1/cards).

# `list_providers`

```elixir
@spec list_providers(TruelayerClient.t()) ::
  {:ok, [map()]} | {:error, TruelayerClient.Error.t()}
```

List available data providers (GET /data/v1/providers).

# `transaction_stream`

```elixir
@spec transaction_stream(TruelayerClient.t(), String.t(), keyword()) :: Enumerable.t()
```

Return a lazy `Stream.t()` of settled transactions for an account.

The stream fetches transactions on first consumption and yields them one at a time.
Compose with `Stream.filter/2`, `Stream.map/2`, `Enum.take/2`, etc.

## Example

    client
    |> TruelayerClient.Data.transaction_stream("acc-001", from: ~U[2024-01-01 00:00:00Z])
    |> Stream.filter(&(&1["amount"] < 0))
    |> Enum.to_list()

---

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