---
title: "Create deposit product"
method: POST
path: "/v1/deposits"
tags: ["Product"]
---

# Create deposit product

`POST /v1/deposits`

## Request

- Base URL: `https://sandbox.pismolabs.io/savings-products`
- URL: `https://sandbox.pismolabs.io/savings-products/v1/deposits`
- Auth: HTTP bearer

Create an organization's time deposit accounts. Time deposit accounts, such as CDs, require you to keep your funds in the account for a mutually agreed amount for a specific period of time.<br>
This endpoint generates the [Deposit product created](https://developers.pismo.io/events/docs/deposit-product-creation-1) event.
For information about interest-bearing accounts, refer to [Interest-bearing accounts](doc:interest-bearing-accounts).
The interest plan is fetched once and used to resolve or validate `accrual_model` before any resource configuration. Missing, null, or empty values derive the model from the plan. An explicit mismatch returns `HTTP 400 EIBACC0365`. An unknown nonempty plan model or a missing plan object returns `HTTP 500 EIBACC0007`, and errors from the interest plan API are passed through. None of these failures configure resources, persist a product, or publish a creation event.

## Request body

- CreateDepositProductRequest
  - `name` string, required: The product name.
  - `interest_plan_id` string, required: Interest rate plan ID. This corresponds to the ID you created using the [Create interest plan version](ref:patch-v1-interest-plan)) endpoint.
  - `term_type` 'FIXED' | 'FLEXIBLE', required: Term type. For example, `FIXED` or `FLEXIBLE`.
  - `accrual_model` 'DEPOSIT_BASIS' | 'BALANCE_BASIS' | '' | 'null', nullable: Defines the balance basis for daily interest accrual: - `DEPOSIT_BASIS`: Net daily balance change (credits minus debits), determined at the end of the day. - `BALANCE_BASIS`: Daily closing balance. If not provided (omitted, `null`, or empty string `""`), the value is derived from the interest plan: `BALANCE-CHANGE` → `DEPOSIT_BASIS` or `CLOSING-BALANCE` → `BALANCE_BASIS`. An explicit value must match the plan; otherwise, the request returns a `400` error: `EIBACC0365`. If the plan's `interest_base_model` is missing, `null`, or empty, the Pismo platform treats it as `CLOSING-BALANCE`, which produces `BALANCE_BASIS` when the request does not set `accrual_model`.
  - `balance_type` 'VALUE_DATED_BALANCE' | 'LEDGER_BALANCE': Which balance of the `balance_history` event is submitted when `accrual_model` is `BALANCE_BASIS`. `VALUE_DATED_BALANCE` uses the cleared balance (default); `LEDGER_BALANCE` includes uncleared funds.
  - `maturity_instructions` DepositMaturityInstructions: - If the principal or interest are `ROLLOVER,` the respective amounts is rolled over to a new deposit term. - If the principal is `PAY`, the principal amount is paid to the payout account at maturity. If no payout account is configured, it remains in the account. - If the interest is `PAY` and the accrued interest is greater than zero, it's paid to the account's cash balance.
    - `principal` 'PAY' | 'ROLLOVER': Specifies the status of the principal amount at maturity. - `PAY`: The principal amount is paid to the payout account. If no payout account is configured, it remains in the account - `ROLLOVER`: The principal amount is rolled over to a new deposit term If no value is selected, the principal defaults to `PAY`.
    - `interest` 'PAY' | 'ROLLOVER': Specifies the status of the accrued interest at maturity. - `PAY`: The accrued interest is paid to the account - `ROLLOVER`: The accrued interest is rolled over and added to the principal If no value is selected, the interest defaults to `PAY`.
  - `processing_codes` DepositProcessingCodes
    - `interest_processing_code` string: Processing code for interest calculation. <br> If you don't specify a value, the default is `009797`.
    - `detach_processing_code` string: Processing code for detaching deposit feature from a bank account.<br> Detaching means the bank removes the deposit feature from the bank account. If you don't specify a value, the default is `009696`.
  - `cool_off_period` integer: Period in days when a withdrawal can be made without penalty.
  - `funding_duration` integer: Period during which money is allowed to deposit into the account before the account is blocked. The value of this field is calculated in days.
  - `grace_period_duration_days` integer: Grace‑period duration in days. The maturity date is a hard boundary, and pay, rollover, and detach execute at maturity. The grace window opens at the start of the next cycle, spanning `cycle_start_date`, `cycle_start_date` + `grace_period`. The first cycle does not include a grace-period window. During grace period, interest accrues daily only when `accrue_during_grace_period` is `true`. If you define a grace‑period penalty, configure it under `penalties.grace_period` (`penalty‑grace` still pauses at maturity and is not relocated).
  - `accrue_during_grace_period` boolean: Controls whether interest continues to accrue during the post‑maturity grace period. When set to `true` (the default), the Pismo platform submits daily accruals to the interest engine. When set to `false`, those submissions stop. If the field is omitted or null, it is treated as `true`. Note that this setting does not change the grace‑period lifecycle.
  - `min_amount` number: The minimum balance required to earn yield. If the balance is below this amount, yield is not calculated, and if no value is specified, any available amount is treated as accrued interest.
  - `max_amount` number: Maximum deposit amount.
  - `min_term` integer: Minimum term duration. The value of this field is calculated in days.
  - `max_term` integer: Maximum term duration. The value of this field is calculated in days.
  - `penalties` DepositPenalties: Set of penalty configurations that can be applied to a deposit product. Each penalty type corresponds to a specific fee ID and transaction flow within the Pismo platform. For details about penalty types, refer to the [Penalty types](doc:penalties-for-cd-accounts#penalty-types) section of Penalties for CD accounts.
    - `early_withdrawal_after_opening` EarlyWithdrawalAfterOpening: This penalty corresponds to fee ID `earlyWithdrawalAfterOpeningPenaltyID` and transaction flow `earlyWithdrawalAfterOpeningPenalty`
      - `applicable_within_days` integer, required: Number of days after opening that the penalty is applied
      - `penalty_interest_days` integer, required: Number of days multiplied by the applicable interest or earnings rate to determine the penalty amount.
    - `grace_period` GracePeriod: This penalty corresponds to fee ID `gracePeriodPenaltyID` and trasaction flow `gracePeriodPenalty`
      - `duration_days` integer, required: Duration of the grace period in days
      - `penalty_interest_days` integer, required: Number of interest days to forfeit as penalty
    - `tiered_interest_forfeiture` TieredInterestForfeitureTier[]: This penalty corresponds to fee ID `tieredInterestForfeiturePenaltyID` and transaction flow `tieredInterestForfeiturePenalty`
      - `min_days_held` integer, required: Minimum number of days the deposit must be held
      - `max_days_held` integer, required: Maximum number of days the deposit can be held
      - `forfeited_interest_days` integer, required: Number of interest days to forfeit as penalty
    - `withdrawal_fee` WithdrawalFee: This penalty corresponds to fee ID `withdrawalFeePenaltyID` and transaction flow `withdrawalFeePenalty`
      - `type` 'PERCENTAGE' | 'FIXED', required: Withdrawal fee type
      - `value` number, required: Value of the withdrawal fee, with up to 2 decimal places. - `PERCENTAGE`: a percentage, not a decimal fraction (`1` = 1%, `0.01` = 0.01%). Fee = `withdrawal_amount × value / 100`. Unlike interest plan rates (`0.035` = 3.5%). - `FIXED`: an amount in the account's currency.
    - `subsequent_withdrawals` SubsequentWithdrawals: This penalty corresponds to fee ID `subsequentWithdrawalPenaltyID` and transaction flow `subsequentWithdrawalPenalty`.<br> Settings for the subsequent withdrawal penalty (Regulation D). A penalty fee is applied when a customer makes a withdrawal within the configured window. The window either resets with each withdrawal (ROLLING) or remains fixed from the first withdrawal (FIXED).
      - `applicable_within_days` integer, required: The number of days following a withdrawal during which a subsequent withdrawal triggers the penalty. Must be at least 1.
      - `window_behavior` 'ROLLING' | 'FIXED', required: Controls how the penalty window is managed after each withdrawal: - `ROLLING`: the window resets on every withdrawal (scheduler is replaced) - `FIXED`: the window is set once on the first withdrawal and does not reset
      - `penalty_interest_days` integer: Number of interest days to forfeit as the penalty amount. Must be at least 1 when provided.
  - `notices` MaturityNotice[]: Advance maturity notice configurations for deposit products only, rejected for savings‑account products. If this field is included in a savings‑account request, the API returns `HTTP 400`. When provided, the field must contain one to three entries, each with a unique `days_before_maturity` value. If the field is absent or the array is empty, no notices are configured.
    - `days_before_maturity` integer, required: Number of days before the account’s maturity date when the notice is sent. The value must be a positive integer greater than zero. Inputs such as zero, negative numbers, decimals, null, or non-numeric values result in `HTTP 400`. Each notice must use a distinct `days_before_maturity` value within the array.
    - `description` string, required: A short, human‑readable label for the notice. Each entry must include one description, and it cannot exceed 128 characters.
  - `start_date` string, date: Define the earliest date from which the product can be attached to an account or program. Attach operations attempted before this date are rejected. Date is displayed in UTC.
  - `end_date` string, date: Defines the final date when the product can be attached to an account or program, rejects any attach operations submitted after that date, uses the `yyyy‑mm‑dd` format with all dates shown in UTC+0 regardless of your timezone, and must be set at least one day after the current date (D+1).
  - `metadata` object: The metadata object contains user-defined key-value pairs that provide additional context or custom information.<br> Metadata content is not controlled by the Pismo platform and is instead controlled by the user.<br> **Note**: This field must not be used to send Personally Identifiable Information (PII), Payment Card Industry (PCI) data, or any sensitive/regulated information. Metadata fields are intended for operational, non-sensitive data only. For sensitive data, use the specific parameters designed for that purpose. For more information, refer to [Get started with Pismo APIs](ref:get-started-with-pismo-apis#metadata).

## Response `201`

Success

- DepositProduct
  - `cool_off_period` integer: Period in days when a withdrawal can be made without penalty.
  - `created_at` string, date-time: Date and time the product was created
  - `updated_at` string, date-time: Date and time the product was last updated. Returned only when the product is updated.
  - `funding_duration` integer: Period during which money is allowed to deposit into the account before the account is blocked. The value of this field is calculated in days.
  - `interest_plan_id` string: Interest rate plan ID. This corresponds to the ID you created using the [Create interest plan version](ref:patch-v1-interest-plan)) endpoint.
  - `maturity_instructions` DepositMaturityInstructions: - If the principal or interest are `ROLLOVER,` the respective amounts is rolled over to a new deposit term. - If the principal is `PAY`, the principal amount is paid to the payout account at maturity. If no payout account is configured, it remains in the account. - If the interest is `PAY` and the accrued interest is greater than zero, it's paid to the account's cash balance.
    - `principal` 'PAY' | 'ROLLOVER': Specifies the status of the principal amount at maturity. - `PAY`: The principal amount is paid to the payout account. If no payout account is configured, it remains in the account - `ROLLOVER`: The principal amount is rolled over to a new deposit term If no value is selected, the principal defaults to `PAY`.
    - `interest` 'PAY' | 'ROLLOVER': Specifies the status of the accrued interest at maturity. - `PAY`: The accrued interest is paid to the account - `ROLLOVER`: The accrued interest is rolled over and added to the principal If no value is selected, the interest defaults to `PAY`.
  - `min_amount` number: The minimum balance required to earn yield. If the balance is below this amount, yield is not calculated, and if no value is specified, any available amount is treated as accrued interest.
  - `max_amount` number: Maximum deposit amount.
  - `min_term` integer: Minimum term duration. The value of this field is calculated in days.
  - `max_term` integer: Maximum term duration. The value of this field is calculated in days.
  - `grace_period_duration_days` integer: The number of days in the grace period. Applies only when no grace‑period penalty is defined. The grace‑period window opens at the start of the next cycle, spanning `cycle_start_date`, `cycle_start_date` + `grace_period_duration_days`, and the renewed cycle’s maturity extends by these days (`cycle_start_date` + `grace_period_duration_days` + term - 1, inclusive). The first cycle does not include a grace period. During grace period, interest accrues daily only when `accrue_during_grace_period` is `true`.
  - `accrue_during_grace_period` boolean: Whether interest accrues daily during the grace window. Defaults to true. When false, no submissions are sent to the Interest Engine during grace (audited as `IN_GRACE_NO_ACCRUAL`) and accrual starts when grace ends. Deposit products only.
  - `name` string: Product name
  - `penalties` DepositPenalties: Set of penalty configurations that can be applied to a deposit product. Each penalty type corresponds to a specific fee ID and transaction flow within the Pismo platform. For details about penalty types, refer to the [Penalty types](doc:penalties-for-cd-accounts#penalty-types) section of Penalties for CD accounts.
    - `early_withdrawal_after_opening` EarlyWithdrawalAfterOpening: This penalty corresponds to fee ID `earlyWithdrawalAfterOpeningPenaltyID` and transaction flow `earlyWithdrawalAfterOpeningPenalty`
      - `applicable_within_days` integer, required: Number of days after opening that the penalty is applied
      - `penalty_interest_days` integer, required: Number of days multiplied by the applicable interest or earnings rate to determine the penalty amount.
    - `grace_period` GracePeriod: This penalty corresponds to fee ID `gracePeriodPenaltyID` and trasaction flow `gracePeriodPenalty`
      - `duration_days` integer, required: Duration of the grace period in days
      - `penalty_interest_days` integer, required: Number of interest days to forfeit as penalty
    - `tiered_interest_forfeiture` TieredInterestForfeitureTier[]: This penalty corresponds to fee ID `tieredInterestForfeiturePenaltyID` and transaction flow `tieredInterestForfeiturePenalty`
      - `min_days_held` integer, required: Minimum number of days the deposit must be held
      - `max_days_held` integer, required: Maximum number of days the deposit can be held
      - `forfeited_interest_days` integer, required: Number of interest days to forfeit as penalty
    - `withdrawal_fee` WithdrawalFee: This penalty corresponds to fee ID `withdrawalFeePenaltyID` and transaction flow `withdrawalFeePenalty`
      - `type` 'PERCENTAGE' | 'FIXED', required: Withdrawal fee type
      - `value` number, required: Value of the withdrawal fee, with up to 2 decimal places. - `PERCENTAGE`: a percentage, not a decimal fraction (`1` = 1%, `0.01` = 0.01%). Fee = `withdrawal_amount × value / 100`. Unlike interest plan rates (`0.035` = 3.5%). - `FIXED`: an amount in the account's currency.
    - `subsequent_withdrawals` SubsequentWithdrawals: This penalty corresponds to fee ID `subsequentWithdrawalPenaltyID` and transaction flow `subsequentWithdrawalPenalty`.<br> Settings for the subsequent withdrawal penalty (Regulation D). A penalty fee is applied when a customer makes a withdrawal within the configured window. The window either resets with each withdrawal (ROLLING) or remains fixed from the first withdrawal (FIXED).
      - `applicable_within_days` integer, required: The number of days following a withdrawal during which a subsequent withdrawal triggers the penalty. Must be at least 1.
      - `window_behavior` 'ROLLING' | 'FIXED', required: Controls how the penalty window is managed after each withdrawal: - `ROLLING`: the window resets on every withdrawal (scheduler is replaced) - `FIXED`: the window is set once on the first withdrawal and does not reset
      - `penalty_interest_days` integer: Number of interest days to forfeit as the penalty amount. Must be at least 1 when provided.
  - `notices` MaturityNotice[]: Advance maturity notice configurations for deposit products only, rejected for savings‑account products. If this field is included in a savings‑account request, the API returns `HTTP 400`. When provided, the field must contain one to three entries, each with a unique `days_before_maturity` value. If the field is absent or the array is empty, no notices are configured.
    - `days_before_maturity` integer, required: Number of days before the account’s maturity date when the notice is sent. The value must be a positive integer greater than zero. Inputs such as zero, negative numbers, decimals, null, or non-numeric values result in `HTTP 400`. Each notice must use a distinct `days_before_maturity` value within the array.
    - `description` string, required: A short, human‑readable label for the notice. Each entry must include one description, and it cannot exceed 128 characters.
  - `processing_codes` DepositProcessingCodes
    - `interest_processing_code` string: Processing code for interest calculation. <br> If you don't specify a value, the default is `009797`.
    - `detach_processing_code` string: Processing code for detaching deposit feature from a bank account.<br> Detaching means the bank removes the deposit feature from the bank account. If you don't specify a value, the default is `009696`.
  - `product_id` string: Product identifier.
  - `product_type` 'deposit' | 'savings-account': Product type
  - `status` 'CREATED' | 'ACTIVE' | 'INACTIVE': Indicates the current state of the product. For example, `CREATED`.
  - `term_type` 'FIXED' | 'FLEXIBLE': Term type. For example, `FIXED` or `FLEXIBLE`.
  - `accrual_model` 'DEPOSIT_BASIS' | 'BALANCE_BASIS': Interest accrual model configured at the product level and returned in both the creation event and API response. With `DEPOSIT_BASIS`, the Pismo platform calculates accruals based on the net daily balance change (credits minus debits) at the end of each day. With `BALANCE_BASIS`, accruals are calculated using the account's closing balance at the end of the day, regardless of whether any transactions occurred. For example, if an account has a balance of 1000 and no transactions are made during the day, the platform still uses 1000 as the accrual basis. At creation, the interest plan determines the model: `BALANCE-CHANGE` maps to `DEPOSIT_BASIS`, and `CLOSING-BALANCE` maps to `BALANCE_BASIS`.
  - `balance_type` 'VALUE_DATED_BALANCE' | 'LEDGER_BALANCE': Which balance of the `balance_history` event is submitted when `accrual_model` is `BALANCE_BASIS`. `VALUE_DATED_BALANCE` uses the cleared balance (default); `LEDGER_BALANCE` includes uncleared funds.
  - `start_date` string, date: Defines the earliest date from which the product can be attached to an account or program. Date is displayed in UTC.
  - `end_date` string, date: Defines the final date when the product can be attached to an account or program, rejects any attach operations submitted after that date, uses the `yyyy‑mm‑dd` format with all dates shown in UTC+0 regardless of your timezone, and must be set at least one day after the current date (D+1).
  - `metadata` object: The metadata object contains user-defined key-value pairs that provide additional context or custom information.<br> Metadata content is not controlled by the Pismo platform and is instead controlled by the user.<br> **Note**: This field must not be used to send Personally Identifiable Information (PII), Payment Card Industry (PCI) data, or any sensitive/regulated information. Metadata fields are intended for operational, non-sensitive data only. For sensitive data, use the specific parameters designed for that purpose. For more information, refer to [Get started with Pismo APIs](ref:get-started-with-pismo-apis#metadata).

## Other responses

- `400`: Bad request
- `409`: Conflict — the penalty processing code already has a divergent tenant balance-config
- `500`: Internal error

---

[API](https://skmtc.dev/pismo/apis/banking-interest-bearing-accounts.md) - [All operations](https://skmtc.dev/pismo/apis/banking-interest-bearing-accounts/llms.txt) - [OpenAPI document](https://skmtc.dev/pismo/apis/banking-interest-bearing-accounts/revisions/c68f61feb8a8?raw)
