---
title: "Create interest plan"
method: POST
path: "/v1/interest/plan"
tags: ["Interest engine"]
---

# Create interest plan

`POST /v1/interest/plan`

## Request

- Base URL: `https://sandbox.pismolabs.io/interest-engine`
- URL: `https://sandbox.pismolabs.io/interest-engine/v1/interest/plan`
- Auth: HTTP bearer

Create an interest plan configuration that defines how the platform calculates interest accrual. After it's created, you can apply the interest plan to a specific product or account. For example, you can provide the `interest_plan_id` when creating a [deposit product](ref:interest-bearing-v1-create-deposit-product), when creating a [savings account](ref:interest-bearing-v1-create-savings-account-product), or when [depositing money](ref:post-v1-interest-deposit) into an account.

This endpoint generates an [Interest plan creation succeeded](https://developers.pismo.io/events/docs/interest-engine-interest-plan-creation-success-1) event.

For more information, refer to the [Interest-bearing accounts](doc:interest-bearing-accounts) guide.

## Request body

- InterestPlanRequest
  - `accrual_basis` 'BD/252' | 'ACTUAL/360' | 'ACTUAL/365' | 'ACTUAL/ACTUAL', required: Method used to calculate interest accrual. * `BD/252`: Calculates daily interest using a 252-day year and the actual number of business days in each time period. * `ACTUAL/360`: Calculates daily interest using a 360-day year and the actual number of days in each time period. * `ACTUAL/365`: Calculates daily interest using a 365-day year and the actual number of days in each time period. * `ACTUAL/ACTUAL`: Calculates daily interest using the actual number of days in the year (which in the leap year is 366) and the actual number of days in each time period.
  - `accrual_frequency` 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'HALF_YEARLY' | 'YEARLY' | 'MATURITY', required: Interest accrual frequency
  - `capitalization_frequency` 'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'HALF_YEARLY' | 'YEARLY' | 'MATURITY', required: Interest payout frequency
  - `currency_code` '986' | '826' | '356' | '840' | '978' | '604' | '036' | '484' | '764' | '208' | '752' | '578', required: Numeric currency code in ISO 4217 standard. Only the following codes are accepted: 986 (BRL), 826 (GBP), 356 (INR), 840 (USD), 978 (EUR), 604 (PEN), 036 (AUD), 484 (MXN), 764 (THB), 208 (DKK), 752 (SEK), 578 (NOK).
  - `description` string, required: Interest plan name
  - `interest_type` 'SIMPLE' | 'COMPOUND', required: Interest calculation type - `SIMPLE`: Calculated on the original deposit or investment value. - `COMPOUND`: Calculated on the original value plus the last accumulated interest.
  - `operation_type` 'DEBIT' | 'CREDIT': Operation type. - `DEBIT`: Interest plan for debit type operations - `CREDIT`: Interest plan for credit type operations
  - `benchmark` 'BOE' | 'DI' | 'FED' | 'RBA' | 'RBI' | 'TO': Market index used to measure interest value over time. For fixed interest, this field must be null. - `BOE`: Bank of England, UK - `DI`: Interbank Deposit Contract, Brazil - `FED`: Federal Reserve System, USA - `RBA`: Reserve Bank of Australia - `RBI`: Reserve Bank of India - `TO`: Overnight Interbank Target Rate (Tasa Objetivo), Mexico
  - `tax_withholding` TaxWithholding: Tax withholding configuration. Replaces the standalone `fee_processing_code` field. Conditional rules enforced at creation/update time: - `ACCRUAL`: `fee_processing_code` is required; `tax_rules` must be omitted. - `CAPITALIZATION`: `tax_rules` is required; `fee_processing_code` must be omitted. - Omitted `withholding_moment`: both `fee_processing_code` and `tax_rules` must be omitted. In GET responses, legacy plans that predate this field may return `fee_processing_code` with a null `withholding_moment`.
    - `withholding_moment` 'ACCRUAL' | 'CAPITALIZATION', required: Moment at which tax is withheld. When omitted, no withholding applies.
    - `fee_processing_code` string: Processing code configured in the [fee model](doc:fee-model) for charging a tax, penalty, or fee.
    - `tax_rules` TaxRule[]
      - `description` string, required: Description of the tax rule.
      - `fixed_percentage` number, required: Fixed percentage applied by the tax rule.
      - `threshold_amount` number, double, nullable: Optional monetary threshold amount associated with the tax rule. Use null when the rule does not depend on a threshold.
  - `fixed_interest_rate` number, float, nullable: Nominal annual interest rate, expressed as a decimal fraction. 0.10 = 10% per year. 1.00 = 100% per year. Do not send 10 for 10%. Maximum precision: 8 decimal places. The platform converts this annual rate to the accrual period using `accrual_basis` and `interest_type`. If you pass a value for `benchmark`, this field must be null. Otherwise, it's required.
  - `margin` number, double: Additive spread, in the same unit and period as the benchmark rate: nominal annual, decimal fraction. If `benchmark` is 0.025 and `margin` is 0.0225, the resulting annual rate is 0.0475. If you pass a value for `benchmark`, this field is optional. If `benchmark` is null, this field must be null also.
  - `margin_rate` number, double, nullable: Multiplier applied to the benchmark rate, expressed as a decimal fraction of 100%. 1.00 = 100% of the benchmark. 1.10 = 110% of the benchmark. 0.95 = 95% of the benchmark. This is not added to the benchmark—use `margin` for an additive spread. If you don't pass a value for `benchmark`, this field must be null. Otherwise, it's required.
  - `start_date` string, date, required: Date to start applying the interest plan. Format = YYYY-MM-DD.
  - `division_id` string: Division ID attached to the interest plan for accrual by division
  - `interest_by_tiers` InterestByTiers: Interest by tiers configuration
    - `type` 'TERM' | 'AMOUNT', required: Interest type - `TERM`: Interest rate varies according to the period of time since the deposit was made. - `AMOUNT`: Interest rate varies according to the current balance.
    - `tier_calculation` 'RETROACTIVE' | 'NON-RETROACTIVE', required: Tier calculation method - `RETROACTIVE`: Interest is recalculated from the beginning based on the new applicable rate. - `NON-RETROACTIVE`: Interest is calculated progressively based on each layer rate.
    - `tiers` InterestByTiersArrayObject[], required
      - `days` integer, nullable: Number of days in `interest_by_tier`
      - `amount` number, double, nullable: Amount in the `interest_by_tier`
      - `margin_rate` number, double, nullable: Multiplier applied to the benchmark rate, expressed as a decimal fraction of 100%. 1.00 = 100% of the benchmark. 1.10 = 110% of the benchmark. 0.95 = 95% of the benchmark. This is not added to the benchmark—use `margin` for an additive spread. If you don't pass a value for `benchmark`, this field must be null. Otherwise, it's required.
      - `fixed_interest_rate` number, float, nullable: Nominal annual interest rate, expressed as a decimal fraction. 0.10 = 10% per year. 1.00 = 100% per year. Do not send 10 for 10%. Maximum precision: 8 decimal places. The platform converts this annual rate to the accrual period using `accrual_basis` and `interest_type`. If you pass a value for `benchmark`, this field must be null. Otherwise, it's required.
  - `interest_thresholds` InterestThresholds: Cap and floor thresholds for the interest plan
    - `cap_threshold` number, double: Cap threshold value. If you pass a value for `cap_threshold`, you must also pass a value for `cap_effective_rate`.
    - `cap_effective_rate` number, double: Cap effective rate. If you pass a value for `cap_effective_rate`, you must also pass a value for `cap_threshold`.
    - `floor_threshold` number, double: Floor threshold value
    - `floor_effective_rate` number, double: Floor effective rate
  - `interest_base_model` 'CLOSING-BALANCE' | 'BALANCE-CHANGE': Interest calculation model. `CLOSING-BALANCE` calculates interest on a single end-of-day balance snapshot. `BALANCE-CHANGE` calculates interest on each intraday balance movement (for example, credits and debits) as it occurs, so interest accrues on the balance held during each interval between consecutive movements rather than on one end-of-day figure. Defaults to `CLOSING-BALANCE`.

## Response `200`

OK

- InterestPlanResponse
  - `interest_plan_id` string, uuid: Interest plan ID generated during the plan's creation. Must be an alphanumeric UUID with the alphabetical characters in lowercase.

## Other responses

- `400`: Bad request
- `401`: Unauthorized. The response body is produced by the upstream authentication gateway and is not defined by this service.
- `404`: Not found
- `500`: Internal server error

---

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