defmodule Solaris do
@moduledoc """
Production-grade Elixir client for the Solaris Embedded Finance API.
See: https://docs.solarisgroup.com/api-reference
## Overview
Solaris is a Banking-as-a-Service platform providing embedded finance APIs covering:
- **Onboarding** — Create persons, businesses, KYC/identification flows
- **Digital Banking** — Accounts, balances, bookings, statements, savings
- **SEPA Transfers** — SCT, SDD, Instant payments
- **Cards** — Issuance, lifecycle, tokenization, 3DS
- **Lending** — Consumer loans, overdraft, splitpay, trade finance
- **Webhooks** — Real-time event processing
## Configuration
config :solaris,
client_id: System.get_env("SOLARIS_CLIENT_ID"),
client_secret: System.get_env("SOLARIS_CLIENT_SECRET"),
environment: :sandbox,
timeout: 30_000,
max_retries: 3,
pool_size: 10
## Quick Start
{:ok, person} = Solaris.Onboarding.Persons.create(%{
first_name: "Jane",
last_name: "Doe",
email: "jane@example.com",
birth_date: ~D[1990-01-15],
nationality: "DE"
})
{:ok, balance} = Solaris.Banking.Accounts.get_balance(account_id)
## Error Handling
All functions return `{:ok, result}` or `{:error, %Solaris.Error{}}`.
"""
alias Solaris.Client
@spec version() :: String.t()
def version, do: to_string(Application.spec(:solaris, :vsn))
@spec environment() :: :sandbox | :production
def environment, do: Solaris.Config.environment()
@spec base_url() :: String.t()
def base_url, do: Solaris.Config.base_url()
@doc "Raw authenticated GET — for endpoints not yet covered by the SDK."
@spec get(String.t(), keyword()) :: {:ok, map()} | {:error, Solaris.Error.t()}
def get(path, opts \\ []), do: Client.get(path, opts)
@doc "Raw authenticated POST."
@spec post(String.t(), map(), keyword()) :: {:ok, map()} | {:error, Solaris.Error.t()}
def post(path, body \\ %{}, opts \\ []), do: Client.post(path, body, opts)
@doc "Raw authenticated PATCH."
@spec patch(String.t(), map(), keyword()) :: {:ok, map()} | {:error, Solaris.Error.t()}
def patch(path, body \\ %{}, opts \\ []), do: Client.patch(path, body, opts)
@doc "Raw authenticated PUT."
@spec put(String.t(), map(), keyword()) :: {:ok, map()} | {:error, Solaris.Error.t()}
def put(path, body \\ %{}, opts \\ []), do: Client.put(path, body, opts)
@doc "Raw authenticated DELETE."
@spec delete(String.t(), keyword()) :: {:ok, map()} | {:error, Solaris.Error.t()}
def delete(path, opts \\ []), do: Client.delete(path, opts)
end