# Loan & Mortgage Amortization Calculator (`mangudai/loan-amortization-calculator`) Actor

Build a full loan or mortgage amortization schedule from an amount, rate, and term. Get one row per payment with principal, interest, and running balance. Supports extra payments, biweekly and other frequencies, and multiple loans. Offline, no API key. Export to CSV, Excel, or JSON.

- **URL**: https://apify.com/mangudai/loan-amortization-calculator.md
- **Developed by:** [Mangudäi](https://apify.com/mangudai) (community)
- **Categories:** Developer tools, Real estate, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Loan & Mortgage Amortization Calculator

Turn a loan amount, an interest rate, and a term into a full amortization schedule. The actor returns one row per payment showing how much goes to principal, how much to interest, and what balance is left. It runs offline with no API and no key, so a run never breaks and never rate limits.

Good for mortgages, car loans, student loans, personal loans, and any fixed-rate installment loan. Feed it several loans at once and export the schedule as CSV, Excel, JSON, or an API feed.

### What it does

For each loan you give it, the actor computes the periodic payment with the standard amortization formula, then walks the balance down payment by payment. You get the interest and principal split for every period, the running balance, and cumulative totals.

Add an extra payment and it shows how much interest you save and how many payments you skip. Switch the frequency to biweekly, weekly, quarterly, or annual and it recomputes the whole schedule.

### Features

- Full amortization schedule, one row per payment
- Multiple loans in a single run
- Extra recurring payment, with interest saved and payments saved
- Monthly, biweekly, weekly, quarterly, or annual frequency
- Term set in years or in months
- Summary mode: one row per loan with the headline numbers
- Zero interest loans and irregular terms handled correctly
- Pure offline math, no third-party API, no key, no rate limits

### Input

| Field | Type | Description |
| --- | --- | --- |
| `loans` | array | One or more loans. Each takes `amount`, `annualRate` (percent), and `termYears` or `termMonths`. Optional: `label`, `extraPayment`, `startDate`. |
| `paymentFrequency` | string | `monthly`, `biweekly`, `weekly`, `quarterly`, or `annually`. Default `monthly`. |
| `outputMode` | string | `schedule` for one row per payment, `summary` for one row per loan. Default `schedule`. |
| `currency` | string | A label added to each row. It tags the output, it does not convert money. |
| `roundCents` | boolean | Round money to two decimals. Default true. |

#### Example input

```json
{
  "loans": [
    { "label": "30-year mortgage", "amount": 300000, "annualRate": 6.5, "termYears": 30 },
    { "label": "5-year car loan", "amount": 25000, "annualRate": 7.9, "termYears": 5, "extraPayment": 100 }
  ],
  "paymentFrequency": "monthly",
  "outputMode": "schedule"
}
````

### Output

Each schedule row has these fields:

| Field | Description |
| --- | --- |
| `loanLabel` | The label of the loan this row belongs to |
| `paymentNumber` | Payment index, starting at 1 |
| `paymentDate` | ISO date of the payment |
| `beginningBalance` | Balance before the payment |
| `scheduledPayment` | The regular payment amount |
| `extraPayment` | Extra amount applied this period |
| `totalPayment` | Scheduled plus extra |
| `principalPaid` | Part that reduces the balance |
| `interestPaid` | Part that covers interest |
| `endingBalance` | Balance after the payment |
| `cumulativeInterest` | Interest paid so far |
| `cumulativePrincipal` | Principal paid so far |
| `currency` | Currency label |

Summary mode returns one row per loan with `scheduledPayment`, `numberOfPayments`, `totalPaid`, `totalInterest`, `payoffDate`, and, when an extra payment is set, `interestSaved` and `paymentsSaved`.

#### Example output row

```json
{
  "loanLabel": "30-year mortgage",
  "paymentNumber": 1,
  "paymentDate": "2026-02-01",
  "beginningBalance": 300000.0,
  "scheduledPayment": 1896.2,
  "extraPayment": 0.0,
  "totalPayment": 1896.2,
  "principalPaid": 271.2,
  "interestPaid": 1625.0,
  "endingBalance": 299728.8,
  "cumulativeInterest": 1625.0,
  "cumulativePrincipal": 271.2,
  "currency": "USD"
}
```

### How the math works

The periodic payment uses the standard formula `P * r / (1 - (1 + r)^-n)`, where `P` is the amount, `r` is the periodic rate (annual rate divided by payments per year), and `n` is the number of payments. Interest each period is the current balance times `r`. The rest of the payment reduces the balance. A zero-rate loan splits the amount evenly across the term.

### Notes

The `currency` field is a label only. The actor does not fetch exchange rates or convert between currencies. Results are estimates for planning and do not account for fees, insurance, taxes, or rate changes on variable-rate loans.

# Actor input Schema

## `loans` (type: `array`):

One or more loans to amortize. Each loan takes amount, annualRate (percent), and termYears (or termMonths). Optional: label, extraPayment (added to every payment), and startDate (ISO date of the loan start; the first payment falls one period later).

## `paymentFrequency` (type: `string`):

How often a payment is made. Applies to every loan.

## `outputMode` (type: `string`):

schedule returns one row per payment. summary returns one row per loan with the headline numbers.

## `currency` (type: `string`):

A label tag added to every row. This does not convert money, it only labels the output.

## `roundCents` (type: `boolean`):

Round money values to cents. Turn off to keep full precision.

## Actor input object example

```json
{
  "loans": [
    {
      "label": "30-year mortgage",
      "amount": 300000,
      "annualRate": 6.5,
      "termYears": 30,
      "extraPayment": 0,
      "startDate": "2026-01-01"
    },
    {
      "label": "5-year car loan",
      "amount": 25000,
      "annualRate": 7.9,
      "termYears": 5,
      "extraPayment": 100,
      "startDate": "2026-01-01"
    }
  ],
  "paymentFrequency": "monthly",
  "outputMode": "schedule",
  "currency": "USD",
  "roundCents": true
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "loans": [
        {
            "label": "30-year mortgage",
            "amount": 300000,
            "annualRate": 6.5,
            "termYears": 30,
            "extraPayment": 0,
            "startDate": "2026-01-01"
        },
        {
            "label": "5-year car loan",
            "amount": 25000,
            "annualRate": 7.9,
            "termYears": 5,
            "extraPayment": 100,
            "startDate": "2026-01-01"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mangudai/loan-amortization-calculator").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "loans": [
        {
            "label": "30-year mortgage",
            "amount": 300000,
            "annualRate": 6.5,
            "termYears": 30,
            "extraPayment": 0,
            "startDate": "2026-01-01",
        },
        {
            "label": "5-year car loan",
            "amount": 25000,
            "annualRate": 7.9,
            "termYears": 5,
            "extraPayment": 100,
            "startDate": "2026-01-01",
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mangudai/loan-amortization-calculator").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "loans": [
    {
      "label": "30-year mortgage",
      "amount": 300000,
      "annualRate": 6.5,
      "termYears": 30,
      "extraPayment": 0,
      "startDate": "2026-01-01"
    },
    {
      "label": "5-year car loan",
      "amount": 25000,
      "annualRate": 7.9,
      "termYears": 5,
      "extraPayment": 100,
      "startDate": "2026-01-01"
    }
  ]
}' |
apify call mangudai/loan-amortization-calculator --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=mangudai/loan-amortization-calculator",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Loan & Mortgage Amortization Calculator",
        "description": "Build a full loan or mortgage amortization schedule from an amount, rate, and term. Get one row per payment with principal, interest, and running balance. Supports extra payments, biweekly and other frequencies, and multiple loans. Offline, no API key. Export to CSV, Excel, or JSON.",
        "version": "0.0",
        "x-build-id": "fFIyvAGDYIdUkkDwL"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/mangudai~loan-amortization-calculator/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-mangudai-loan-amortization-calculator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/mangudai~loan-amortization-calculator/runs": {
            "post": {
                "operationId": "runs-sync-mangudai-loan-amortization-calculator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/mangudai~loan-amortization-calculator/run-sync": {
            "post": {
                "operationId": "run-sync-mangudai-loan-amortization-calculator",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "loans"
                ],
                "properties": {
                    "loans": {
                        "title": "Loans",
                        "type": "array",
                        "description": "One or more loans to amortize. Each loan takes amount, annualRate (percent), and termYears (or termMonths). Optional: label, extraPayment (added to every payment), and startDate (ISO date of the loan start; the first payment falls one period later).",
                        "default": [
                            {
                                "label": "30-year mortgage",
                                "amount": 300000,
                                "annualRate": 6.5,
                                "termYears": 30,
                                "extraPayment": 0,
                                "startDate": "2026-01-01"
                            },
                            {
                                "label": "5-year car loan",
                                "amount": 25000,
                                "annualRate": 7.9,
                                "termYears": 5,
                                "extraPayment": 100,
                                "startDate": "2026-01-01"
                            }
                        ]
                    },
                    "paymentFrequency": {
                        "title": "Payment frequency",
                        "enum": [
                            "monthly",
                            "biweekly",
                            "weekly",
                            "quarterly",
                            "annually"
                        ],
                        "type": "string",
                        "description": "How often a payment is made. Applies to every loan.",
                        "default": "monthly"
                    },
                    "outputMode": {
                        "title": "Output mode",
                        "enum": [
                            "schedule",
                            "summary"
                        ],
                        "type": "string",
                        "description": "schedule returns one row per payment. summary returns one row per loan with the headline numbers.",
                        "default": "schedule"
                    },
                    "currency": {
                        "title": "Currency label",
                        "type": "string",
                        "description": "A label tag added to every row. This does not convert money, it only labels the output.",
                        "default": "USD"
                    },
                    "roundCents": {
                        "title": "Round money to 2 decimals",
                        "type": "boolean",
                        "description": "Round money values to cents. Turn off to keep full precision.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
