# Savings Accounts (Tagesgeld)

The Savings Account product enables your customers to open **overnight deposit accounts** (*Tagesgeld*) that earn interest on end-of-day balances.

Unlike fixed-term deposits, customers can transfer funds in and out of their savings account instantly via their main Solaris current account. Solaris handles the interest calculation (daily) and payout (monthly), as well as the submission of tax exemption orders (*Freistellungsauftrag*) to the relevant authorities.

## Product overview

### Key features

* **Daily Accrual:** Interest is calculated daily based on the end-of-day balance.
* **Monthly Payout:** Solaris settles earned interest on the first day of the following month (Valuta: last day of the previous month).
* **Interest Caps:** Interest accrues only up to a defined balance limit per partner. Amounts exceeding this cap do not earn interest.
* **Reference Account:** The savings account is strictly linked to the customer's main Solaris current account. Funds can only move between these two accounts.
* **Tax Management:** Retail customers can submit a Tax Exemption Order to exempt specific amounts of capital gains from taxation.
* **Interest Profiles:** Custom interest conditions can be defined at the partner level.


### Eligibility & Prerequisites

German Tax ID Required
This product is exclusively available to customers of the **German (DE) Branch** who possess a valid **German Tax ID**. Customers with non-German tax IDs cannot open a Savings Account.

* **Customer Segments:** Available for Retail (B2C), Business (B2B), and Freelancers.
* **Account Limit:** Maximum **one** active Savings Account per customer per partner.
* **Main Account:** The customer must have an active Solaris current account before opening a savings account.


## Integration steps

### 1. Validate Tax ID

Before offering the product, prompt the customer to confirm the validity of their registered German Tax ID.

Use **GET Index tax identifications** to retrieve the stored data.

* [Persons API Reference](/api-reference/onboarding/persons/person-tax-identifications/paths/~1v1~1persons~1%7bperson_id%7d~1tax_identifications/get#/api-reference/onboarding/persons/person-tax-identifications/paths/~1v1~1persons~1%7Bperson_id%7D~1tax_identifications/get)


### 2. Create account opening request

Follow the standard [Account Opening Request](/guides/digital-banking/account-opening/) process. However, you must use the specific `product_name` and `account_type` values listed below.

#### Product Type Matrix

| Customer Segment | `product_name` | `account_type` |
|  --- | --- | --- |
| **Retail (Consumer)** | `SAVINGS_ACCOUNT_CONSUMER_GERMANY` | `SAVINGS_PERSONAL` |
| **Business** | `SAVINGS_ACCOUNT_BUSINESS_GERMANY` | `SAVINGS_BUSINESS` |
| **Freelancer** | `SAVINGS_ACCOUNT_FREELANCER_GERMANY` | `SAVINGS_SOLE_PROPRIETOR` |


Automatic Credit Block
Solaris automatically applies a **credit block** to the new Savings Account. This ensures no funds can be deposited until the account is successfully mapped to a main account (Step 3).

### 3. Map to Main Account

Once the Savings Account is `OPENED`, you must link it to the customer's main current account. This action removes the credit block, registers the account with our tax service provider, and attaches the interest profile.


```mermaid
graph TD
    %% Global Styles
    classDef default fill:#fff,stroke:#333,stroke-width:1px;
    classDef partner fill:#f9f9f9,stroke:#666,stroke-dasharray: 5 5;
    classDef error stroke:#d32f2f,color:#d32f2f,stroke-width:2px;
    classDef success stroke:#2e7d32,color:#2e7d32,stroke-width:2px;

    %% PARTNER COLUMN
    subgraph Partner_Lane [PARTNER]
        direction TB
        Request[Place a request for<br>main account mapping]
        ErrorEnd((ERROR)):::error
        SuccessEnd((SUCCESS)):::success
    end

    %% SOLARIS COLUMN
    subgraph Solaris_Lane [SOLARIS]
        direction TB
        Validate{Request<br>validated?}
        TagAccount[Tag the current<br>account as main<br>account for the<br>savings account]
        DefineInterest[Define the interest<br>conditions for the<br>savings account]
        RegisterTax[Register the<br>customer and<br>account with tax<br>provider]
        
        CheckSteps{The three<br>steps above<br>completed?}
        
        ErrorWebhook[Publish error<br>response<br>through Webhook]
        RemoveBlock[Remove credit<br>block on<br>account]
        SuccessWebhook[Publish success<br>response<br>through Webhook]
    end

    %% TAX PROVIDER COLUMN
    subgraph Tax_Lane [TAX PROVIDER]
        direction TB
        PerformReg[Perform registration<br>and give back<br>response]
    end

    %% CONNECTIONS
    %% Start Flow
    Request --> Validate
    
    %% Validation Logic
    Validate -- 4xx Error --> Request
    Validate -- 202 Accepted --> TagAccount

    %% Internal Solaris Process
    TagAccount --> DefineInterest
    DefineInterest --> RegisterTax
    
    %% External Call
    RegisterTax -.-> PerformReg
    PerformReg -.-> RegisterTax

    %% Completion Check
    RegisterTax --> CheckSteps
    
    %% Failure Path
    CheckSteps -- NO --> ErrorWebhook
    ErrorWebhook -- Webhook --> ErrorEnd

    %% Success Path
    CheckSteps -- YES --> RemoveBlock
    RemoveBlock --> SuccessWebhook
    SuccessWebhook -- Webhook --> SuccessEnd
```

#### Validation Rules

Solaris enforces the following constraints during mapping. Ensure your application logic respects these rules to avoid errors:

* **Ownership Match:** The main account must belong to the same Person or Business ID as the savings account.
* **Active Status:** The main account must be `ACTIVE` and have no blocking flags.
* **1:1 Relationship:** A savings account can only be mapped to **one** main account.
* **Single Savings Account:** A main account cannot be linked to multiple savings accounts simultaneously.


#### Create the mapping

This is an asynchronous process. You must subscribe to the `DEPOSIT_ACCOUNT_UPDATED` webhook to receive the final success or failure status.

Persons
**Endpoint:** `POST /v1/persons/{person_id}/deposit_accounts/{account_id}/mappings`


```json
{
  "reference": "73a46685-8ac6-4fff-9d36-55288523d879",
  "main_account_id": "148c29b85992b8772eb7ddd518490110cacc",
  "deposit_type": "SAVINGS_ACCOUNT",
  "interest_tier": "INTEREST_BASE_TIER"
}
```

Businesses
**Endpoint:** `POST /v1/businesses/{business_id}/deposit_accounts/{account_id}/mappings`


```json
{
  "reference": "82b57796-9bd7-5ggg-0e47-66399634e980",
  "main_account_id": "259d30c96003c9883fc8eee62950121dbdd",
  "deposit_type": "SAVINGS_ACCOUNT",
  "interest_tier": "INTEREST_BASE_TIER"
}
```

**Managing savings account mappings**

Use the mapping endpoints to manage the association between a savings account and a primary transaction account. This allows you to retrieve existing mapping details or update configurations such as interest tiers and account links.

**Note:** These endpoints are currently available for Person accounts only and do not support Business accounts.

**Retrieving mapping details**

Before performing an update, use the `GET` endpoint to verify the current configuration, status, and interest tier of a mapping.

**Endpoint:** `GET /v1/persons/{person_id}/deposit_accounts/{account_id}/mappings`

**Updating mapping configurations**

The `PATCH` endpoint allows you to modify an existing mapping for a person's savings account. You can perform two primary operations with this endpoint:

- Adjust the interest rate tier: Update the specific interest category applied to the account.
- Update the main account IBAN: Change the primary account association (this applies only to savings accounts with an external reference account).


**Endpoint:** `PATCH /v1/persons/{person_id}/deposit_accounts/{account_id}/mappings`

**Specify Interest Tiers**

If you've configured multiple standard interest rates (tiered interest rates), you must provide the specific value in the interest_tier field. If you don't send a value, the account defaults to the base tier.

### 4. Move Funds (Pay-in / Payout)

Funds are moved using dedicated `payin` and `payout` endpoints. Direct SEPA transfers to the Savings Account IBAN are **not supported**; funds must route through the main account.

#### Pay-in (Main -> Savings)

Transfer funds from the checking account to the savings account.

#### Validation Rules

When moving funds, the API validates the following conditions. A failure in any of these will result in a declined transaction:

* **Mapping Check:** The source and destination accounts must be explicitly mapped (see Step 3). You cannot transfer funds between unmapped accounts, even if they belong to the same customer.
* **Active Status:** Both the Savings Account and the Main Account must be `ACTIVE`.
* **Blocking Check:** Neither account can have a blocking flag (e.g., for suspected fraud or arrears) that prevents money movement.
* **Balance Check:** For pay-ins, the main account must have sufficient funds.


Persons
**Endpoint:** `POST /v1/persons/{person_id}/deposit_accounts/{account_id}/payin`

Businesses
**Endpoint:** `POST /v1/businesses/{business_id}/deposit_accounts/{account_id}/payin`


```json
{
    "reference": "unique-uuid-v4",
    "main_account_id": "148c29b85992b8772eb7ddd518490110cacc",
    "description": "Savings Goal 2025",
    "amount": {
        "value": 1000,
        "currency": "EUR",
        "unit": "cents"
    }
}
```

#### Payout (Savings -> Main)

Transfer funds from the savings account back to the checking account.

Persons
**Endpoint:** `POST /v1/persons/{person_id}/deposit_accounts/{account_id}/payout`

Businesses
**Endpoint:** `POST /v1/businesses/{business_id}/deposit_accounts/{account_id}/payout`

### 5. Check Interest Details

Retrieve the current interest rate, accrued interest, and calculation date for any account.

Persons
**Endpoint:** `GET /v1/persons/{person_id}/deposit_accounts/{account_id}/interest_details`

Businesses
**Endpoint:** `GET /v1/businesses/{business_id}/deposit_accounts/{account_id}/interest_details`

### Reporting & Statements

* **Annual Tax Statement:** Solaris generates an annual tax certificate (*Jahressteuerbescheinigung*) for every customer. This document is delivered automatically via the [Postbox API](/guides/compliance/postbox) at the end of the fiscal year.


## Tax Exemption Orders (*Freistellungsauftrag*)

Persons Only
Tax exemption orders are only available for **natural persons**. Business accounts do not support this feature via the Solaris API.

Customers can submit an exemption order to prevent automatic tax deduction on interest earnings (up to a statutory limit, currently 1,000 EUR for individuals).


```mermaid
graph TD
    %% Global Styles
    classDef default fill:#fff,stroke:#333,stroke-width:1px;
    classDef error stroke:#d32f2f,color:#d32f2f,stroke-width:2px;
    classDef success stroke:#2e7d32,color:#2e7d32,stroke-width:2px;
    classDef accepted stroke:#0288d1,color:#0288d1,stroke-width:2px;

    %% PARTNER COLUMN
    subgraph Partner_Lane [PARTNER]
        direction TB
        Request[Place a request to<br>create tax<br>exemption order]
        PartnerAccepted((Accepted)):::accepted
        PartnerError((ERROR)):::error
        PartnerErrorUpdate((ERROR<br>Use update form)):::error
        WebhookError((ERROR)):::error
        WebhookSuccess((SUCCESS)):::success
    end

    %% SOLARIS COLUMN
    subgraph Solaris_Lane [SOLARIS]
        direction TB
        ValRequest{Request<br>validated?}
        ValAccount{Savings<br>Account<br>Available?}
        ValExisting{Exemption<br>order present<br>for the cust tax<br>ID?}
        
        ProvideResponse[Provide request<br>accepted response]
        
        PlaceAsync[Place request for<br>creating exemption<br>order]
        
        CheckSuccess{Request<br>successful?}
    end

    %% TAX PROVIDER COLUMN
    subgraph Tax_Lane [TAX PROVIDER]
        direction TB
        TaxAction[Create exemption<br>order and give back<br>response]
    end

    %% CONNECTIONS
    
    %% Start
    Request --> ValRequest
    
    %% Validation Loop
    ValRequest -- 4xx Error --> Request
    ValRequest -- Yes --> ValAccount
    
    %% Account Check
    ValAccount -- No / 4xx Error --> PartnerError
    ValAccount -- Yes --> ValExisting
    
    %% Existing Check
    ValExisting -- Yes / 4xx Error --> PartnerErrorUpdate
    ValExisting -- No --> ProvideResponse
    
    %% Accepted Response
    ProvideResponse -- 202 Accepted --> PartnerAccepted
    ProvideResponse --> PlaceAsync
    
    %% Async Call
    PlaceAsync -. ASYNC .-> TaxAction
    TaxAction -.-> PlaceAsync
    
    %% Final Status
    PlaceAsync --> CheckSuccess
    
    CheckSuccess -- NO / Webhook --> WebhookError
    CheckSuccess -- YES / Webhook --> WebhookSuccess
```

**Scope:** A tax exemption order applies to the customer's **entire banking relationship** with Solaris. If a customer has accounts with multiple Solaris partners, this single order applies to the aggregated total.

### Create exemption order

#### Validation Rules

* **Natural Persons Only:** Business customers cannot submit exemption orders.
* **Single Order Rule:** A customer can only have **one** active exemption order. If an order already exists, you must use the `PATCH` endpoint to update it, rather than `POST`ing a new one.
* **Year Validation:** `valid_from_year` cannot be in the past.
* **Amount Limit:** The maximum exemption amount is currently capped at **1,000 EUR** (per statutory regulations).
* **Individual Only:**  Joint exemption orders (e.g., for spouses or civil partners) are not supported. Exemptions apply strictly to the individual account holder.


**Endpoint:** `POST /v1/persons/{person_id}/deposit_accounts/{account_id}/tax_exemptions`

This is an asynchronous request. Solaris validates the order against the customer's Tax ID.


```json
{
    "reference": "7aa04f97-7720-4609-a5c5-d7b0f86e7661",
    "valid_from_year": "2025",
    "valid_to_year": "2026",
    "amount": {
        "value": 100000,
        "currency": "EUR",
        "unit": "cents" 
    }
}
```

*Note: Value must be in cents (e.g., 100000 = 1,000.00 EUR).*

### Manage exemptions

| Action | Endpoint | Description |
|  --- | --- | --- |
| **View** | `GET .../tax_exemptions` | Retrieve the active order status and amount. |
| **Update** | `PATCH .../tax_exemptions` | Change the exemption amount or validity period. |
| **Close** | `PATCH .../tax_exemptions/close` | Terminate the order. Solaris calculates utilized amounts before closing. |
| **Delete** | `DELETE .../tax_exemptions` | **Only** use if the order was created in error and has **never** been utilized. |


### Check Utilization

To see how much of the exemption has been used:

1. Call `POST /v1/persons/{person_id}/deposit_accounts/{account_id}/tax_exemptions/utilization`.
2. Listen for the `TAX_EXEMPTION_UTILIZATION` webhook event.


## Webhooks

Subscribe to these events to manage the asynchronous savings workflows.

| Event | Trigger | Action Required |
|  --- | --- | --- |
| `ACCOUNT_OPENING_REQUEST` | Account creation status changes (Approved/Declined). | Notify customer of account opening. |
| `DEPOSIT_ACCOUNT_UPDATED` | Mapping to main account is complete. | Remove UI blockers; allow pay-ins. |
| `TAX_EXEMPTION_UPDATED` | Exemption order created or updated. | Update "Exemption Amount" in UI. |
| `TAX_EXEMPTION_UTILIZATION` | Utilization check requested. | Display used/remaining amount to customer. |


## Account Closure

To close a Savings Account, use the standard [Account Closure](/guides/compliance/account-closure) endpoints.

**Solaris will automatically:**

1. Settle any outstanding interest.
2. Transfer the remaining balance + interest to the main account.
3. Close the savings account.


## API Reference

Explore the full technical specifications for these endpoints.

Savings Accounts (Persons)
Manage mappings, pay-ins, and tax exemptions for retail customers.

Savings Accounts (Business)
Manage mappings and transfers for B2B accounts.