Account interest

Partially update account interest [Beta]

Record an effective-dated change to the interest configuration of an account. Send only the interest parameters you want to change, together with the date on which the change takes effect. The change is appended to the account's history of configuration changes, which you can retrieve with Get account interest.

Key features:

  • Updates only the provided parameters. A parameter that is omitted is left untouched, and a parameter sent as null clears the account-level value so the interest plan value applies.
  • Applies from effective_date and, optionally, up to end_date. After end_date, the configuration that applied before the change takes effect again.
  • Allows overlapping changes. For each parameter, the most recently created change that covers a date determines the value that applies on that date.
  • Validates the resulting configuration for every date from today onward and rejects the request with 400 when it is invalid.
  • Rejects requests that contain no interest parameter, only dates and metadata.

Once an account has a configuration change, PUT /v1/interest/account/{accountId} is rejected for that account with 409.

Account identification. The token identifies the account. Exactly one of x-account-id or x-external-account-id must be passed and must match the {accountId} path parameter. Otherwise the request is rejected (403 on a mismatch or when neither header is passed, 400 when both are).

Stored identifiers. Which identifiers are stored follows the header used:

  • x-account-id: An Accounts API call confirms the account ID exists, then account_id is stored with the change.
  • x-external-account-id: A Corporate API call resolves the external account ID to a Pismo account_id, and both IDs are stored with the change.

If the Accounts or Corporate API cannot resolve the identifier the request fails with 400 and nothing is persisted. Any other failure of those APIs fails with 500.

Idempotency. If a change was already recorded with the same x-cid for the organization, the request succeeds without recording a second change.

When a new change is recorded, the endpoint publishes an interest_account_update_success event.

patch/v1/interest/account/{accountId}

Request

  • Base URL
    https://sandbox.pismolabs.io/interest-engine
  • URL
    https://sandbox.pismolabs.io/interest-engine/v1/interest/account/{accountId}
  • Auth
    HTTP bearer

Path parameters

accountIdstring required

Account ID. Must match the account encoded in the account token. This can be a Pismo account ID or an external account ID. A mismatch is rejected with 403 Forbidden. Maximum 60 characters.

Request body

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
fixed_interest_ratenumber 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_ratenumber 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.

marginnumber 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.

taxes_exemptionboolean

Is the account exempt from taxes?

capitalization_frequency'DAILY' | 'MONTHLY' | 'QUARTERLY' | 'HALF_YEARLY' | 'YEARLY' | 'MATURITY'

Interest payout frequency

effective_datestring date required

First day on which the change applies. Format = YYYY-MM-DD.

end_datestring date nullable

Last day on which the change applies, inclusive. After this day, the configuration that applied before the change takes effect again. When omitted or null, the change has no end date. Must be equal to or greater than effective_date. Format = YYYY-MM-DD.

metadataMetadata

Free-form key-value data to store with the change. The serialized JSON can be at most 4096 bytes. When omitted, an empty object is stored and returned.

Example request

{
  "benchmark": "FED",
  "margin_rate": 1.3,
  "margin": 0.05,
  "effective_date": "2026-11-01",
  "end_date": "2026-12-31",
  "metadata": {
    "campaign": "year-end-promotion"
  }
}

Response

OK

effective_datestring date required

First day on which the change applies. Format = YYYY-MM-DD.

end_datestring date nullable

Last day on which the change applies, inclusive. After this day, the configuration that applied before the change takes effect again. When omitted or null, the change has no end date. Must be equal to or greater than effective_date. Format = YYYY-MM-DD.

created_atstring

Date and time when the change was recorded, in ISO 8601 format without a time zone offset

metadataMetadata required

Free-form key-value data to store with the change. The serialized JSON can be at most 4096 bytes. When omitted, an empty object is stored and returned.

Example response

{
  "interest_parameters": {
    "benchmark": "FED",
    "margin_rate": 1.3,
    "margin": 0.05
  },
  "effective_date": "2026-11-01",
  "end_date": "2026-12-31",
  "created_at": "2026-10-14T15:04:05.123456",
  "metadata": {
    "campaign": "year-end-promotion"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.