---
title: "Create a new transaction to a ledger"
method: POST
path: "/v2/{ledger}/transactions"
tags: ["ledger.v2"]
---

# Create a new transaction to a ledger

`POST /v2/{ledger}/transactions`

## Path parameters

- `ledger` string, required

## Query parameters

- `dryRun` boolean
- `force` boolean
- `schemaVersion` string

## Headers

- `Idempotency-Key` string

## Request body

- V2PostTransaction
  - `timestamp` string, date-time — The transaction time to record, letting you backdate or postdate the transaction. Defaults to current machine time if omitted. See [bi-temporality](https://docs.formance.com/modules/ledger/working-with/bi-temporality)
  - `postings` V2Posting[] — Fund movements to apply. Mutually exclusive with script and template
    - `amount` integer, required — Amount to move, as an arbitrary-precision integer expressed in the asset's smallest unit
    - `asset` string, required — The asset being moved, optionally carrying a scale suffix such as USD/2
    - `destination` string, required — Address of the account credited by this posting
    - `source` string, required — Address of the account debited by this posting
  - `script` object — A Numscript program executed to produce the postings. Mutually exclusive with postings
    - `template` string
    - `plain` string
    - `vars` object
  - `runtime` 'experimental-interpreter' | 'machine' — The numscript runtime used to execute the script. Uses "machine" by default, unless the "--experimental-numscript-interpreter" feature flag is passed.
  - `reference` string — Optional caller-supplied identifier, unique within the ledger, used to deduplicate transactions
  - `metadata` V2Metadata, required — Arbitrary key/value pairs attached to the resource. Metadata is bi-temporal, so a point-in-time query returns the metadata as it stood at that time
  - `accountMetadata` object — Metadata to set on the accounts involved in the transaction, keyed by account address
  - `force` boolean — When true, lets source accounts overdraft without bound, bypassing the balance check. Applies to the postings form only

## Response `200`

OK

- V2CreateTransactionResponse
  - `data` V2Transaction, required — A transaction recorded in the ledger, carrying its postings, metadata and both bi-temporal timestamps
    - `insertedAt` string, date-time — The request time: when the transaction was actually written to the ledger. Set by the ledger, not the caller. See [bi-temporality](https://docs.formance.com/modules/ledger/working-with/bi-temporality)
    - `updatedAt` string, date-time — When the transaction row was last modified, for example by a metadata change or a revert
    - `timestamp` string, date-time, required — The transaction time: when the transaction is considered to have occurred, also called the effective or booking date. This is the axis the ledger uses to compute balances and resolve point-in-time queries. Settable at creation, defaulting to current machine time if omitted, and immutable once written. See [bi-temporality](https://docs.formance.com/modules/ledger/working-with/bi-temporality)
    - `postings` V2Posting[], required — The fund movements making up the transaction
      - `amount` integer, required — Amount to move, as an arbitrary-precision integer expressed in the asset's smallest unit
      - `asset` string, required — The asset being moved, optionally carrying a scale suffix such as USD/2
      - `destination` string, required — Address of the account credited by this posting
      - `source` string, required — Address of the account debited by this posting
    - `reference` string — Optional caller-supplied identifier, unique within the ledger, used to deduplicate transactions
    - `metadata` V2Metadata, required — Arbitrary key/value pairs attached to the resource. Metadata is bi-temporal, so a point-in-time query returns the metadata as it stood at that time
    - `id` integer, required — Unique sequential identifier for this transaction within the ledger
    - `reverted` boolean, required — Indicates if the transaction has been reverted
    - `revertedAt` string, date-time — When the transaction was reverted, on the request-time axis. Absent if the transaction has not been reverted
    - `preCommitVolumes` V2AggregatedVolumes — Volumes aggregated per account and per asset
    - `postCommitVolumes` V2AggregatedVolumes — Volumes aggregated per account and per asset
    - `preCommitEffectiveVolumes` V2AggregatedVolumes — Volumes aggregated per account and per asset
    - `postCommitEffectiveVolumes` V2AggregatedVolumes — Volumes aggregated per account and per asset
    - `template` string — Name of the transaction template this transaction was created from, if any

## Other responses

- `default` — Error

## Changes

- **2026-01-06** `76fa93a7b1aa` — 3 info
  - added the new optional request property `script/template`
  - the request property `script/plain` became optional
  - added the optional property `data/template` to the response with the `200` status
- **2025-12-12** `2945092328b9` — 2 warning, 1 info
  - added the new `SCHEMA_ALREADY_EXISTS` enum value to the `errorCode` response property for the response status `default`
  - added the new `SCHEMA_NOT_SPECIFIED` enum value to the `errorCode` response property for the response status `default`
  - added the new optional `query` request parameter `schemaVersion`
- **2025-11-27** `40dde0d2ab0c` — 1 info
  - `query` request parameter `force` was reactivated
- **2025-07-16** `07091e08e779` — 1 info
  - added the optional property `data/updatedAt` to the response with the `200` status
- **2025-05-22** `5d95dc0cdcbe` — 2 info
  - added the new optional request property `force`
  - `query` request parameter `force` was deprecated

[Full history](https://skmtc.dev/formancehq/apis/ledger-api/changes/v2/:ledger/transactions/post.md)

---

[API](https://skmtc.dev/formancehq/apis/ledger-api.md) · [All operations](https://skmtc.dev/formancehq/apis/ledger-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/formancehq/ledger-api/revisions/fe945da1b75d/schema)
