---
title: "Create Installment Series"
method: POST
path: "/api/transactions/installments"
tags: ["transactions"]
---

# Create Installment Series

`POST /api/transactions/installments`

## Request

- Base URL: `https://demo.usesecuro.com` (the document declares no server; this is the origin it was published from)
- URL: `https://demo.usesecuro.com/api/transactions/installments`
- Auth: OAuth 2
  - Password
  - Token URL: `/api/auth/login`
- TypeScript: <https://skmtc.dev/usesecuro/apis/securo/docs/api/transactions/installments/post.ts> (a function with typed inputs; its response is checked against the schema)

Create a manual installment series: repeats the base transaction
N times, each parcel carrying the shared installment fingerprint.

## Headers

- `X-Workspace-Id` string, nullable

## Request body

- InstallmentSeriesCreate: Payload for POST /api/transactions/installments — repeats a purchase as ``installments`` equal payments.
  - `base` TransactionCreate, required
    - `description` string, required
    - `amount` union, required
      - number
      - string
    - `date` string, date, required
    - `type` string, required
    - `external_id` string, nullable
    - `currency` string, nullable
    - `fx_rate` union
      - number
      - string
    - `payee_raw` string, nullable
    - `account_id` string, uuid, required
    - `category_id` string, uuid, nullable
    - `payee_id` string, uuid, nullable
    - `notes` string, nullable
    - `amount_primary` union
      - number
      - string
    - `fx_rate_used` union
      - number
      - string
    - `effective_bill_date` string, date, nullable
    - `splits` TransactionSplitsInput: Whole splits payload attached to a transaction.
      - `share_type` 'equal' | 'exact' | 'percent', required
      - `splits` TransactionSplitInput[], required
        - `group_member_id` string, uuid, required
        - `share_amount` union
          - number
          - string
        - `share_pct` union
          - number
          - string
        - `notes` string, nullable
    - `status` 'posted' | 'pending', nullable
    - `installment_number` integer, nullable
    - `total_installments` integer, nullable
    - `installment_total_amount` union
      - number
      - string
    - `installment_purchase_date` string, date, nullable
  - `installments` integer, required: Number of parcels (>= 2)
  - `first_installment_status` 'posted' | 'pending'
  - `frequency` 'monthly' | 'quarterly' | 'semiannual' | 'weekly' | 'biweekly' | 'yearly'

## Response `201`

Successful Response

- TransactionRead[]
  - `description` string, required
  - `amount` string, required
  - `date` string, date, required
  - `type` string, required
  - `external_id` string, nullable
  - `currency` string
  - `fx_rate` string, nullable
  - `payee_raw` string, nullable
  - `id` string, uuid, required
  - `user_id` string, uuid, required
  - `account_id` string, uuid, nullable
  - `category_id` string, uuid, nullable
  - `category` CategoryRead
    - `name` string, required
    - `icon` string
    - `color` string
    - `id` string, uuid, required
    - `user_id` string, uuid, required
    - `group_id` string, uuid, nullable
    - `is_system` boolean, required
    - `is_hidden` boolean
    - `treat_as_transfer` boolean
    - `is_ignored` boolean
  - `invoice_links` TransactionInvoiceLink[]
    - `invoice_id` string, uuid, required
    - `number` integer, nullable
    - `series` string, nullable
    - `external_number` string, nullable
    - `amount` string, required
  - `source` string, required
  - `status` string
  - `payee` string, nullable
  - `original_description` string, nullable
  - `payee_id` string, uuid, nullable
  - `payee_name` string, nullable
  - `notes` string, nullable
  - `transfer_pair_id` string, uuid, nullable
  - `transfer_counterpart` TransactionTransferCounterpart: The other leg of a linked transfer, as seen from a list row. Filled only by the paginated list, one query per page (issue #810), so the badge on a row can name the account the transfer is linked to without a per-row request. The dialog keeps using the dedicated transfer-pair endpoint, which carries date and amount too.
    - `account_id` string, uuid, required
    - `account_name` string, required
  - `amount_primary` number, nullable
  - `fx_rate_used` number, nullable
  - `fx_fallback` boolean
  - `attachment_count` integer
  - `installment_number` integer, nullable
  - `total_installments` integer, nullable
  - `installment_total_amount` number, nullable
  - `installment_purchase_date` string, date, nullable
  - `installment_series_id` string, uuid, nullable
  - `bill_id` string, uuid, nullable
  - `effective_bill_date` string, date, nullable
  - `recurring_transaction_id` string, uuid, nullable
  - `splits` TransactionSplitRead[]
    - `id` string, uuid, required
    - `transaction_id` string, uuid, required
    - `group_member_id` string, uuid, required
    - `share_amount` string, required
    - `share_type` string, required
    - `share_pct` string, nullable
    - `notes` string, nullable
    - `created_at` string, date-time, required
  - `is_shared` boolean
  - `viewer_share` string, nullable
  - `group_id` string, uuid, nullable
  - `parent_owner_name` string, nullable
  - `is_ignored` boolean
  - `exclude_from_pnl` boolean
  - `running_balance` number, nullable
  - `running_balance_primary` number, nullable

## Other responses

- `422`: Validation Error

## Changes

- **2026-11-05** `416a7752fec4`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/usesecuro/apis/securo/changes/api/transactions/installments/post.md)

---

[API](https://skmtc.dev/usesecuro/apis/securo.md) - [All operations](https://skmtc.dev/usesecuro/apis/securo/llms.txt) - [OpenAPI document](https://skmtc.dev/usesecuro/apis/securo/revisions/416a7752fec4?raw)
