# `Tink.Link`
[🔗](https://github.com/iamkanishka/tink.ex/blob/v0.1.1/lib/tink/link.ex#L1)

Tink Link URL builder for user authentication flows.

This module provides utilities for building Tink Link URLs for various
use cases including:

- Account aggregation
- Payment initiation
- Account verification
- Income verification
- Transaction access

## Features

- **Multiple Products**: Support for all Tink products
- **Customizable**: Market, locale, styling options
- **Test Mode**: Testing without real credentials
- **Redirect Handling**: Callback URL management

## Tink Link Products

- **Transactions**: Account and transaction data
- **Account Check**: Account ownership verification
- **Income Check**: Income verification
- **Payment Initiation**: Make payments
- **Expense Check**: Expense analysis
- **Risk Insights**: Risk assessment

## Use Cases

### Transaction Access

    @spec create_transactions_link(String.t(), String.t()) :: String.t()

    def create_transactions_link(authorization_code, user_email) do
      Tink.Link.build_url(:transactions, %{
        client_id: get_client_id(),
        authorization_code: authorization_code,
        redirect_uri: "https://myapp.com/callback",
        market: "GB",
        locale: "en_US",
        test: false
      })
    end

### Account Verification

    @spec create_verification_link(String.t()) :: String.t()

    def create_verification_link(authorization_code) do
      Tink.Link.build_url(:account_check, %{
        client_id: get_client_id(),
        authorization_code: authorization_code,
        redirect_uri: "https://myapp.com/verify/callback",
        market: "GB",
        locale: "en_US"
      })
    end

### Payment Initiation

    @spec create_payment_link(String.t()) :: String.t()

    def create_payment_link(payment_request_id) do
      Tink.Link.build_url(:payment, %{
        client_id: get_client_id(),
        payment_request_id: payment_request_id,
        redirect_uri: "https://myapp.com/payment/callback",
        market: "SE",
        locale: "sv_SE"
      })
    end

## Markets

- `GB` - United Kingdom
- `SE` - Sweden
- `DE` - Germany
- `FR` - France
- `ES` - Spain
- `IT` - Italy
- `NL` - Netherlands
- `BE` - Belgium
- `DK` - Denmark
- `NO` - Norway
- `FI` - Finland
- `AT` - Austria
- `PT` - Portugal

## Locales

- `en_US` - English (US)
- `en_GB` - English (UK)
- `sv_SE` - Swedish
- `da_DK` - Danish
- `nb_NO` - Norwegian
- `fi_FI` - Finnish
- `de_DE` - German
- `fr_FR` - French
- `es_ES` - Spanish
- `it_IT` - Italian
- `nl_NL` - Dutch
- `pt_PT` - Portuguese

## Links

- [Tink Link Documentation](https://docs.tink.com/resources/tink-link)

# `account_check_url`

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

Builds a Tink Link URL for account verification.

## Parameters

  * `authorization_code` - Authorization code from grant
  * `opts` - Link options (same as build_url/2)

## Returns

  * Tink Link URL string

## Examples

    url = Tink.Link.account_check_url("auth_code_456", %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/verify",
      market: "GB",
      locale: "en_US"
    })

# `build_url`

```elixir
@spec build_url(
  :account_check
  | :expense_check
  | :income_check
  | :payment
  | :risk_insights
  | :transactions,
  map()
) :: String.t()
```

Builds a Tink Link URL for the specified product.

## Parameters

  * `product` - Product type (atom):
    * `:transactions` - Transactions/account aggregation
    * `:account_check` - Account verification
    * `:income_check` - Income verification
    * `:payment` - Payment initiation
    * `:expense_check` - Expense check
    * `:risk_insights` - Risk insights
  * `params` - Link parameters:
    * `:client_id` - Your client ID (required)
    * `:redirect_uri` - Callback URL (required)
    * `:market` - Market code (required)
    * `:locale` - Locale code (required)
    * `:authorization_code` - Authorization code (for continuous access)
    * `:payment_request_id` - Payment request ID (for payments)
    * `:test` - Test mode (boolean, default: false)
    * `:input_provider` - Pre-select provider
    * `:input_username` - Pre-fill username (test mode only)

## Returns

  * Tink Link URL string

## Examples

    # Transactions (continuous access)
    url = Tink.Link.build_url(:transactions, %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/callback",
      authorization_code: "auth_code_123",
      market: "GB",
      locale: "en_US"
    })
    #=> "https://link.tink.com/1.0/transactions/connect-accounts?client_id=..."

    # Account Check
    url = Tink.Link.build_url(:account_check, %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/verify",
      authorization_code: "auth_code_456",
      market: "GB",
      locale: "en_US"
    })

    # Payment
    url = Tink.Link.build_url(:payment, %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/payment/done",
      payment_request_id: "payment_789",
      market: "SE",
      locale: "sv_SE"
    })

    # Test mode
    url = Tink.Link.build_url(:transactions, %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/test",
      authorization_code: "test_auth",
      market: "GB",
      locale: "en_US",
      test: true,
      input_provider: "testbank-gb",
      input_username: "testuser"
    })

## Product-specific Requirements

### Transactions
- Requires: `authorization_code` (for continuous access) OR just client_id (for one-time)

### Account Check
- Requires: `authorization_code`

### Income Check
- Requires: `authorization_code`

### Payment
- Requires: `payment_request_id`

### Expense Check
- Requires: `authorization_code`

### Risk Insights
- Requires: `authorization_code`

# `payment_url`

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

Builds a Tink Link URL for payment initiation.

## Parameters

  * `payment_request_id` - Payment request ID
  * `opts` - Link options (same as build_url/2)

## Returns

  * Tink Link URL string

## Examples

    url = Tink.Link.payment_url("payment_789", %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/payment/done",
      market: "SE",
      locale: "sv_SE"
    })

# `transactions_url`

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

Builds a Tink Link URL for transactions (continuous access).

Convenience function for the most common use case.

## Parameters

  * `authorization_code` - Authorization code from grant
  * `opts` - Link options:
    * `:client_id` - Your client ID (required)
    * `:redirect_uri` - Callback URL (required)
    * `:market` - Market code (required)
    * `:locale` - Locale code (required)
    * `:test` - Test mode (default: false)

## Returns

  * Tink Link URL string

## Examples

    url = Tink.Link.transactions_url("auth_code_123", %{
      client_id: "your_client_id",
      redirect_uri: "https://yourapp.com/callback",
      market: "GB",
      locale: "en_US"
    })

---

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