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

# Create interest plan

`POST /v1/interest/plan`

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](https://developers.pismo.io/pismo-docs/reference/interest-bearing-v1-create-deposit-product), when creating a [savings account](https://developers.pismo.io/pismo-docs/reference/interest-bearing-v1-create-savings-account-product), or when [depositing money](https://developers.pismo.io/pismo-docs/reference/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](https://developers.pismo.io/pismo-docs/docs/interest-bearing-accounts) guide.

## Headers

- `Authorization` string, required
- `content-type` string, required

## 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` string, required — ISO 4217 3-letter currency code, For example, `986` = Brazilian real and `840` = US dollar.
  - `description` string, required — Challenge result
  - `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.
  - `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, number — Processing code configured in the [fee model](https://developers.pismo.io/pismo-docs/docs/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 — Amount threshold above which the tax rule applies.
  - `fixed_interest_rate` number, float — Fixed annual interest rate for investments or deposits. If a `benchmark` value is provided, this field must be null.
  - `margin` number, double — Also known as a spread, this is an incremental rate the clients receive on investments or deposits. If a `benchmark` value is provided, this field is optional. If `benchmark` is null, this field must be null also.
  - `margin_rate` number, double — Rate linked to the benchmark rate. For example, for 110% FED, margin rate is 110%. If a `benchmark` value is not provided, this field must be null.
  - `start_date` string, date — 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 — Number of days in `interest_by_tier`
      - `amount` number, double — Fee amount.
      - `margin_rate` number, double — Rate linked to the benchmark rate. For example, for 110% FED, margin rate is 110%. If a `benchmark` value is not provided, this field must be null.
      - `fixed_interest_rate` number, float — Fixed annual interest rate for investments or deposits. If a `benchmark` value is provided, this field must be null.
  - `interest_thresholds` InterestThresholds — Cap and floor thresholds for the interest plan
    - `cap_threshold` number, double — Cap threshold value. If you provide a value for `cap_threshold`, you must also provide a value for `cap_effective_rate`.
    - `cap_effective_rate` number, double — Cap effective rate. If you provide a value for `cap_effective_rate`, you must also provide 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` uses the end-of-day balance. `BALANCE-CHANGE` uses balance variation events. 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` — Access token is missing or invalid
- `404` — Not Found
- `500` — Internal server error

---

[API](https://skmtc.net/pismo/apis/platform-authentication.md) · [All operations](https://skmtc.net/pismo/apis/platform-authentication/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/pismo/platform-authentication/versions/935b62e16de4/schema)
