---
updatedAt: 2026-07-23T19:16:49.000Z
---

Fetch the complete documentation index at: https://developers.pismo.io/pismo-docs/llms.txt. Use this file to discover all available pages before exploring further.

# Create interest plan (B3 only)

Create an interest plan configuration that defines how the platform calculates interest accrual.

**Note:** Only Brazilian Stock Exchange (B3) customers should use this endpoint.

Once 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-management-interest-plan-creation-success-1) event.

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


# OpenAPI definition

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Banking - Interest management (B3)",
    "version": "1.0.0",
    "description": "API to handle interest-bearing account operations",
    "contact": {
      "name": "API Support",
      "url": "https://developers.pismo.io/support/"
    },
    "license": {
      "name": "Copyright Pismo"
    }
  },
  "servers": [
    {
      "url": "https://sandbox-integration.pismolabs.io/interest-management",
      "description": "Sandbox API server for testing"
    },
    {
      "url": "https://sandbox.pismolabs.io/passport/v2/s2s/access-token",
      "description": "Sandbox API for oauth2"
    }
  ],
  "tags": [
    {
      "name": "Interest plan",
      "description": "Manage interest plans"
    }
  ],
  "components": {
    "parameters": {
      "Authorization": {
        "name": "authorization",
        "in": "header",
        "description": "Authorization",
        "required": true,
        "example": "Bearer ac194ce4-ecbe-4007-91bd-94babf388e7278f243bc-4ad8-4ead-a2c3-f42a548fe760",
        "schema": {
          "type": "string"
        }
      },
      "ContentType": {
        "name": "content-type",
        "in": "header",
        "description": "Content type",
        "required": true,
        "example": "application/json",
        "schema": {
          "type": "string"
        }
      }
    },
    "schemas": {
      "AccrualBasis": {
        "type": "string",
        "description": "Method used to calculate interest accrual.\n  * `BD/252`: Calculates daily interest using a 252-day year and the actual number of business days in each time period.\n  * `ACTUAL/360`: Calculates daily interest using a 360-day year and the actual number of days in each time period.\n  * `ACTUAL/365`: Calculates daily interest using a 365-day year and the actual number of days in each time period.\n  * `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.\n",
        "enum": [
          "BD/252",
          "ACTUAL/360",
          "ACTUAL/365",
          "ACTUAL/ACTUAL"
        ],
        "example": "ACTUAL/365"
      },
      "AccrualFrequency": {
        "type": "string",
        "description": "Interest accrual frequency",
        "enum": [
          "DAILY",
          "MONTHLY",
          "QUARTERLY",
          "HALF-YEARLY",
          "YEARLY"
        ],
        "example": "DAILY"
      },
      "Benchmark": {
        "type": "string",
        "description": "Market index used to measure interest value over time. For fixed interest, this field must be null.\n  - BOE: Bank of England, UK\n  - DI: Interbank Deposit Contract, Brazil\n  - FED: Federal Reserve System, USA\n  - RBA: Reserve Bank of Australia\n  - RBI: Reserve Bank of India   \n",
        "enum": [
          "BOE",
          "DI",
          "FED",
          "RBA",
          "RBI"
        ],
        "example": "FED"
      },
      "CapitalisationFrequency": {
        "type": "string",
        "description": "Interest payout frequency",
        "enum": [
          "DAILY",
          "MONTHLY",
          "QUARTERLY",
          "HALF-YEARLY",
          "YEARLY"
        ],
        "example": "DAILY"
      },
      "CurrencyCode": {
        "type": "string",
        "format": "number",
        "description": "Numeric currency code in ISO 4217 standard",
        "example": "986"
      },
      "Description": {
        "type": "string",
        "description": "Interest plan name",
        "example": "Banking plan"
      },
      "ErrorResponse": {
        "type": "object",
        "description": "Standard error payload generated by the global exception handler.\n`message` is a single string for most errors and an array of strings\nwhen multiple bean-validation or request-binding errors occur in the same request.\n",
        "additionalProperties": false,
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            ]
          }
        },
        "example": {
          "message": "interest account not found"
        }
      },
      "ErrorResponseDeserialization": {
        "type": "object",
        "description": "Error payload generated only when the request body fails JSON deserialization\n(unknown field or invalid JSON structure). Returned with HTTP 400.\n",
        "additionalProperties": false,
        "required": [
          "error",
          "status"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "Short error category."
          },
          "message": {
            "type": "string",
            "description": "Details about the field or structure that causes the error."
          },
          "field": {
            "type": "string",
            "description": "Name of the invalid field. Present only for unknown-field errors."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code, always 400 for this shape."
          }
        },
        "example": {
          "error": "Invalid field in request",
          "message": "Field 'foo' is not allowed. Only the following fields can be updated: start_date, description, benchmark, fixed_interest_rate, margin_rate, margin, interest_by_tiers, interest_thresholds",
          "field": "foo",
          "status": 400
        }
      },
      "FeeProcessingCode": {
        "type": "string",
        "format": "number",
        "description": "Processing code configured in the [fee model](https://developers.pismo.io/pismo-docs/docs/fee-model) for charging a tax, penalty, or fee.",
        "example": "001100"
      },
      "FixedInterestRate": {
        "type": "string",
        "format": "number",
        "description": "Fixed annual interest rate for investments or deposits. If a `benchmark` value is provided, this field must be null. Otherwise, this field is required.",
        "example": "0.10"
      },
      "InterestPlanId": {
        "type": "string",
        "format": "UUID",
        "description": "Interest plan ID generated during the plan's creation. Must be an alphanumeric UUID with the alphabetical characters in lowercase.",
        "example": "07d84f79-3027-47bd-b628-65528ccc8fb2"
      },
      "InterestPlanRequest": {
        "title": "Interest plan request",
        "type": "object",
        "properties": {
          "accrual_basis": {
            "$ref": "#/components/schemas/AccrualBasis"
          },
          "accrual_frequency": {
            "$ref": "#/components/schemas/AccrualFrequency"
          },
          "capitalisation_frequency": {
            "$ref": "#/components/schemas/CapitalisationFrequency"
          },
          "currency_code": {
            "$ref": "#/components/schemas/CurrencyCode"
          },
          "description": {
            "$ref": "#/components/schemas/Description"
          },
          "interest_type": {
            "$ref": "#/components/schemas/InterestType"
          },
          "benchmark": {
            "$ref": "#/components/schemas/Benchmark"
          },
          "fee_processing_code": {
            "$ref": "#/components/schemas/FeeProcessingCode"
          },
          "fixed_interest_rate": {
            "$ref": "#/components/schemas/FixedInterestRate"
          },
          "margin": {
            "$ref": "#/components/schemas/Margin"
          },
          "margin_rate": {
            "$ref": "#/components/schemas/MarginRate"
          }
        },
        "required": [
          "accrual_basis",
          "accrual_frequency",
          "capitalisation_frequency",
          "currency_code",
          "description",
          "interest_type"
        ],
        "example": {
          "accrual_basis": "ACTUAL/365",
          "accrual_frequency": "DAILY",
          "capitalisation_frequency": "DAILY",
          "currency_code": "986",
          "description": "BANKING PLAN",
          "interest_type": "COMPOUND",
          "benchmark": "FED",
          "fee_processing_code": "001100",
          "margin": 0.05,
          "margin_rate": 1.2
        }
      },
      "InterestPlanResponse": {
        "title": "Org parameters response",
        "type": "object",
        "properties": {
          "interest_plan_id": {
            "$ref": "#/components/schemas/InterestPlanId"
          }
        }
      },
      "InterestType": {
        "type": "string",
        "description": "Interest calculation type.\n- SIMPLE: Calculated on the original deposit or investment value.\n- COMPOUND: Calculated on the original value plus the last accumulated interest.\n",
        "enum": [
          "SIMPLE",
          "COMPOUND"
        ],
        "example": "SIMPLE"
      },
      "Margin": {
        "type": "number",
        "format": "double",
        "description": "Also known as a spread, this is an incremental rate the clients receive over the investments or deposits. \nIf a `benchmark` value is provided, this field is optional.\nIf `benchmark` is null, this field must be null also.\n",
        "example": 0.02
      },
      "MarginRate": {
        "type": "number",
        "format": "double",
        "description": "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. Otherwise, this field is required.",
        "example": 1.1
      }
    },
    "responses": {
      "400BadRequest": {
        "description": "Bad request",
        "content": {
          "application/json": {
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                {
                  "$ref": "#/components/schemas/ErrorResponseDeserialization"
                }
              ]
            },
            "examples": {
              "validation": {
                "summary": "Bean validation or binding errors",
                "value": {
                  "message": [
                    "fixed_interest_rate must be informed",
                    "margin_rate must be positive"
                  ]
                }
              },
              "requestBody": {
                "summary": "invalid or missing request value",
                "value": {
                  "message": "Failed to process your request. Validate the fields in your request."
                }
              },
              "tenantHeader": {
                "summary": "Tenant header missing or malformed",
                "value": {
                  "message": "x-tenant header is missing or malformed"
                }
              },
              "unknownField": {
                "summary": "Unknown field in request body",
                "value": {
                  "error": "Invalid field in request",
                  "message": "Field 'foo' is not allowed. Only the following fields can be updated: start_date, description, benchmark, fixed_interest_rate, margin_rate, margin, interest_by_tiers, interest_thresholds",
                  "field": "foo",
                  "status": 400
                }
              },
              "invalidJson": {
                "summary": "Invalid JSON body",
                "value": {
                  "error": "Invalid JSON format",
                  "message": "Request contains invalid JSON structure or field types",
                  "status": 400
                }
              }
            }
          }
        }
      },
      "401Unauthorized": {
        "description": "Unauthorized access",
        "content": {
          "application/json": {
            "schema": {
              "properties": {
                "message": {
                  "type": "string",
                  "example": "You cannot access this resource"
                }
              }
            }
          }
        }
      },
      "404NotFound": {
        "description": "Not found",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "examples": {
              "interestAccountNotFound": {
                "summary": "Interest account not found",
                "value": {
                  "message": "interest account not found"
                }
              },
              "interestPlanNotFound": {
                "summary": "Interest plan not found",
                "value": {
                  "message": "Interest plan not found"
                }
              },
              "benchmarkNotFound": {
                "summary": "Benchmark not found",
                "value": {
                  "message": "benchmark not found"
                }
              }
            }
          }
        }
      },
      "500InternalServerError": {
        "description": "Internal server error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorResponse"
            },
            "example": {
              "message": "Failed to process your request"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "paths": {
    "/v1/interest/plan": {
      "post": {
        "summary": "Create interest plan (B3 only)",
        "description": "Create an interest plan configuration that defines how the platform calculates interest accrual.\n\n**Note:** Only Brazilian Stock Exchange (B3) customers should use this endpoint.\n\nOnce 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.\n\nThis endpoint generates an [Interest plan creation succeeded](https://developers.pismo.io/events/docs/interest-management-interest-plan-creation-success-1) event.\n\nFor more information, refer to the [Interest-bearing accounts](https://developers.pismo.io/pismo-docs/docs/interest-bearing-accounts) guide.\n",
        "tags": [
          "Interest plan"
        ],
        "operationId": "post-v1-interest-plan-b3",
        "parameters": [
          {
            "$ref": "#/components/parameters/Authorization"
          },
          {
            "$ref": "#/components/parameters/ContentType"
          }
        ],
        "requestBody": {
          "description": "Request body",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InterestPlanRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InterestPlanResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/401Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/404NotFound"
          },
          "500": {
            "$ref": "#/components/responses/500InternalServerError"
          }
        }
      }
    }
  }
}
```