# create_draft_journal

`POST /api/v1/commands/create_draft_journal`

Base URL: `https://boringbooks.io`.



## Request body

| Field | Type | Required | Description |
|---|---|---|---|
| `ledger_id` | string (uuid) | yes |  |
| `lines` | array of object | yes | Min items: `1`. Max items: `100`. |
| `lines[].account_id` | string (uuid) | yes |  |
| `lines[].amount` | `AmountInput` | yes |  |
| `lines[].side` | string | yes | One of: `debit`, `credit`. |
| `lines[].dimensions` | object, nullable | no |  |
| `lines[].memo` | string, nullable | no | Max length: `4000`. |
| `posting_date` | string (date) | yes |  |
| `currency` | `CurrencyInput` | no |  |
| `description` | string, nullable | no | Max length: `4000`. |
| `proposal_kind` | string | no | Where the proposal came from, as a short lowercase label: `manual` (the default), or your own, such as `import` or `bank_feed`. `system` is reserved for the journals the ledger writes itself, closing entries and reversals. Default: `"manual"`. Max length: `64`. |
| `rationale` | string, nullable | no | Max length: `4000`. |

Example:

```json
{
  "description": "Owner's initial investment",
  "ledger_id": "11111111-1111-4111-8111-111111111111",
  "lines": [
    {
      "account_id": "22222222-2222-4222-8222-222222222222",
      "amount": "1000.00",
      "side": "debit"
    },
    {
      "account_id": "33333333-3333-4333-8333-333333333333",
      "amount": "1000.00",
      "side": "credit"
    }
  ],
  "posting_date": "2026-01-15"
}
```

## Response (200)

| Field | Type | Required | Description |
|---|---|---|---|
| `id` | string (uuid) | yes |  |
| `status` | string | yes |  |

## Shared types

Fields typed with one of these names refer to it.

- `AmountInput` (string): An unsigned decimal magnitude as a string, greater than zero, in plain notation: digits with an optional fractional part, and no sign, exponent, or separators. "100" and "100.0" are accepted and normalized to the currency's scale ("100.00" for most currencies, "100" for JPY); more precision than the currency admits ("100.005" for USD, "100.5" for JPY) is rejected, never rounded.
- `CurrencyInput` (string): An ISO 4217 alphabetic currency code from the supported set. It must be the target ledger's functional currency: a different supported currency is refused with `foreign_currency_not_supported`, and a currency outside the supported set is rejected outright. The supported set is additive and may grow. One of: `AUD`, `CAD`, `CHF`, `EUR`, `GBP`, `JPY`, `USD`.

## Errors

Every error response is a single `error` object with a closed `type` and a refining
`code`. The codes, and the conventions every operation shares, are in
[llms-full.txt](https://boringbooks.io/llms-full.txt).
