POST
/
api
/
external
/
v2
/
transactions
Create a transaction
curl --request POST \
  --url https://app.pennylane.com/api/external/v2/transactions \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "bank_account_id": 42,
  "label": "test label",
  "date": "2025-07-30",
  "amount": "120.00",
  "fee": "12.00"
}'
{
  "id": 42,
  "label": "VIR SEPA MY SUPPLIER SAS",
  "attachment_required": true,
  "date": "2023-08-30",
  "outstanding_balance": "49.3",
  "created_at": "2023-08-30T10:08:08.146343Z",
  "updated_at": "2023-08-30T10:08:08.146343Z",
  "archived_at": "2023-08-30T10:08:08.146343Z",
  "currency": "EUR",
  "currency_amount": "120.00",
  "amount": "120.00",
  "currency_fee": "120.00",
  "fee": "120.00",
  "journal_id": 42,
  "journal": {
    "id": 234,
    "url": "https://app.pennylane.com/api/external/v2/journals/67"
  },
  "bank_account": {
    "id": 53,
    "url": "https://app.pennylane.com/api/external/v2/bank_accounts/53"
  },
  "pro_account_expense": {
    "employee": {
      "id": 42,
      "first_name": "John",
      "last_name": "Doe"
    },
    "card_masked_number": "123456XXXXXX7890"
  },
  "customer": {
    "id": 42,
    "url": "https://app.pennylane.com/api/external/v2/customers/42"
  },
  "supplier": {
    "id": 42,
    "url": "https://app.pennylane.com/api/external/v2/supplier/42"
  },
  "categories": [
    {
      "id": 421,
      "label": "HR - Salaries",
      "weight": "0.25",
      "category_group": {
        "id": 229
      },
      "analytical_code": "CODE123",
      "created_at": "2023-08-30T10:08:08.146343Z",
      "updated_at": "2023-08-30T10:08:08.146343Z"
    }
  ],
  "matched_invoices": {
    "url": "https://app.pennylane.com/api/external/v2/transactions/42/matched_invoices"
  }
}

Authorizations

Authorization
string
header
required

The access token received from the authorization server in the OAuth 2.0 flow.

Body

application/json
bank_account_id
integer
required

The bank account where the transaction is registered

Example:

42

label
string
required

Transaction label

Example:

"test label"

date
string<date>
required

Transaction date

Example:

"2025-07-30"

amount
string
required

Transaction amount

Example:

"120.00"

fee
string
required

Transaction fee

Example:

"12.00"

Response

Transaction created

id
integer
required

Transaction identifier

Example:

42

label
string | null
required
Example:

"VIR SEPA MY SUPPLIER SAS"

attachment_required
boolean
required

When true, the transaction need to be justified and matched with an invoice

Example:

true

date
string<date>
required
Example:

"2023-08-30"

outstanding_balance
string | null
required

This is the balance of the transaction after it has been processed.

Example:

"49.3"

created_at
string<date-time>
required
Example:

"2023-08-30T10:08:08.146343Z"

updated_at
string<date-time>
required
Example:

"2023-08-30T10:08:08.146343Z"

archived_at
string<date-time> | null
required
Example:

"2023-08-30T10:08:08.146343Z"

currency
default:EUR
required
Available options:
EUR,
USD,
GBP,
AED,
AFN,
ALL,
AMD,
ANG,
AOA,
ARS,
AUD,
AWG,
AZN,
BAM,
BBD,
BDT,
BGN,
BHD,
BIF,
BMD,
BND,
BOB,
BRL,
BSD,
BTN,
BWP,
BYN,
BYR,
BZD,
CAD,
CDF,
CHF,
CLF,
CLP,
CNY,
COP,
CRC,
CUC,
CUP,
CVE,
CZK,
DJF,
DKK,
DOP,
DZD,
EGP,
ERN,
ETB,
FJD,
FKP,
GEL,
GGP,
GHS,
GIP,
GMD,
GNF,
GTQ,
GYD,
HKD,
HNL,
HRK,
HTG,
HUF,
IDR,
ILS,
IMP,
INR,
IQD,
IRR,
ISK,
JEP,
JMD,
JOD,
JPY,
KES,
KGS,
KHR,
KMF,
KPW,
KRW,
KWD,
KYD,
KZT,
LAK,
LBP,
LKR,
LRD,
LSL,
LTL,
LVL,
LYD,
MAD,
MDL,
MGA,
MKD,
MMK,
MNT,
MOP,
MRO,
MUR,
MVR,
MWK,
MXN,
MYR,
MZN,
NAD,
NGN,
NIO,
NOK,
NPR,
NZD,
OMR,
PAB,
PEN,
PGK,
PHP,
PKR,
PLN,
PYG,
QAR,
RON,
RSD,
RUB,
RWF,
SAR,
SBD,
SCR,
SDG,
SEK,
SGD,
SHP,
SLL,
SOS,
SRD,
STD,
SVC,
SYP,
SZL,
THB,
TJS,
TMT,
TND,
TOP,
TRY,
TTD,
TWD,
TZS,
UAH,
UGX,
UYU,
UZS,
VEF,
VND,
VUV,
WST,
XAF,
XCD,
XDR,
XOF,
XPF,
YER,
ZAR,
ZMK,
ZMW,
ZWL
currency_amount
string
required

Amount in the currency of the transaction.

Example:

"120.00"

amount
string
required

Transaction amount in euros. If the currency is euro, currency_amount and amount are identical.

Example:

"120.00"

currency_fee
string | null
required

Fee in the currency of the transaction.

Example:

"120.00"

fee
string | null
required

Transaction fee in euros. If the currency is euro, currency_fee and fee are identical.

Example:

"120.00"

journal_id
integer
required
deprecated

This parameter is deprecated. Please use journal instead.

Example:

42

journal
object
required
bank_account
object
required
pro_account_expense
object | null
required
customer
object | null
required
supplier
object | null
required
categories
object[]
required
matched_invoices
object
required