Bilanzierung
Der Vorschlag für die Eröffnungsbilanz eines Geschäftsjahres.
GET/api/invoice/opening_balance/{identifier}
Path parameters
identifierrequiredstring |
Responses
200Vorschlag mit abgeleiteten Positionen und Übergangsgewinn
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/opening_balance/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/opening_balance/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/opening_balance/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/opening_balance/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/opening_balance/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/opening_balance/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/opening_balance/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/opening_balance_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await OpeningBalanceController.getProposal('42');
if (result.success) {
print(result.data);
}Bucht die Eröffnungsbilanz aus den geprüften Positionen.
POST/api/invoice/opening_balance/{identifier}
Das Eigenkapital wird nicht mitgegeben - es ergibt sich als Differenz und wird serverseitig errechnet. Eine Eröffnungsbilanz geht so immer auf, und ein negatives Kapital ist eine Aussage, kein Fehler.
Path parameters
identifierrequiredstring |
Request body application/json
positionsarray<object>Show fields (4)
account_numberstringsidestringamountnumberlabelstring
Responses
200Die erzeugte EröffnungsbuchungJournalEntry
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
linesarray<JournalEntryLine>Lines of the entry.
Show fields (9)
idintegerPrimary key of the journal entry line. Internal ID.
ledger_accountLedgerAccountLedger account that is booked.
cost_centerCostCenterCost center of the booking.
debitnumber (float)Sollbetrag. Aktiv- und Aufwandskonten mehren sich hier. DECIMAL und nicht DOUBLE. Ein binaerer Fliesskommawert kann 0,10 Euro nicht darstellen; bei einer einzelnen Buchung faellt das durch das Runden auf Cent nicht auf, ueber eine Summenspalte mit zehntausend Zeilen schon. Die Datenbank rechnet DECIMAL exakt, und genau ueber diese Spalten laufen die Summen der Saldenliste. Nach aussen bleibt es float: Doctrine liefert DECIMAL als Zeichenkette, die Getter wandeln um, und die Setter schreiben sie auf zwei Nachkommastellen normiert zurueck.
creditnumber (float)Habenbetrag. Passiv-, Eigenkapital- und Ertragskonten mehren sich hier.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition of the line in the journal entry.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/opening_balance/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"positions": [
{
"account_number": "1200",
"side": "debit",
"amount": 1234.56,
"label": "Bankguthaben"
}
]
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
positions: [
{account_number: '1200', side: 'debit', amount: 1234.56, label: 'Bankguthaben'}
]
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/opening_balance/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/opening_balance/42"
payload = { "positions": [
{
"account_number": "1200",
"side": "debit",
"amount": 1234.56,
"label": "Bankguthaben"
}
] }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/opening_balance/42', [
'body' => '{"positions":[{"account_number":"1200","side":"debit","amount":1234.56,"label":"Bankguthaben"}]}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/opening_balance/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"positions\":[{\"account_number\":\"1200\",\"side\":\"debit\",\"amount\":1234.56,\"label\":\"Bankguthaben\"}]}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"positions\":[{\"account_number\":\"1200\",\"side\":\"debit\",\"amount\":1234.56,\"label\":\"Bankguthaben\"}]}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/opening_balance/42")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/opening_balance/42"
payload := strings.NewReader("{\"positions\":[{\"account_number\":\"1200\",\"side\":\"debit\",\"amount\":1234.56,\"label\":\"Bankguthaben\"}]}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/opening_balance_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await OpeningBalanceController.post('42', List<OpeningBalancePosition>.fromJson({
"positions": [
{
"account_number": "1200",
"side": "debit",
"amount": 1234.56,
"label": "Bankguthaben"
}
]
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"fiscal_year": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"deleted": true,
"created": "2026-10-15T09:30:00+02:00"
}
}Bilanz eines Geschäftsjahres.
GET/api/invoice/accounting/{identifier}/balance_sheet
Path parameters
identifierrequiredstring |
Query parameters
cost_centerstring | Auf eine Sphäre eingrenzen |
Responses
200Bilanz zum Stichtag
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/balance_sheet"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getBalanceSheet('42');
if (result.success) {
print(result.data);
}Gewinn- und Verlustrechnung eines Geschäftsjahres.
GET/api/invoice/accounting/{identifier}/profit_and_loss
Path parameters
identifierrequiredstring |
Query parameters
cost_centerstring |
Responses
200Gewinn- und Verlustrechnung
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/profit_and_loss"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getProfitAndLoss('42');
if (result.success) {
print(result.data);
}Summen- und Saldenliste eines Geschäftsjahres.
GET/api/invoice/accounting/{identifier}/trial_balance
Path parameters
identifierrequiredstring |
Responses
200Summen- und Saldenliste
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/trial_balance"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getTrialBalance('42');
if (result.success) {
print(result.data);
}Ergebnis je steuerlicher Sphäre.
GET/api/invoice/accounting/{identifier}/spheres
Für den gemeinnützigen Verein die entscheidende Auswertung: nur der wirtschaftliche Geschäftsbetrieb ist steuerpflichtig.
Path parameters
identifierrequiredstring |
Responses
200Ergebnis je Sphäre
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/spheres"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getSpheres('42');
if (result.success) {
print(result.data);
}Bilanz in der Gliederung des § 266 HGB, mit Vorjahreswerten.
GET/api/invoice/accounting/{identifier}/hgb_balance_sheet
Die gewoehnliche Bilanz ist eine Kontenliste - richtig gerechnet, aber nicht in der Form, die das Gesetz vorgibt. Hier stehen die Posten des § 266 HGB, je mit dem Vorjahresbetrag (§ 265 Abs. 2 HGB) und den Konten, aus denen sie entstanden sind.
Path parameters
identifierrequiredstring |
Query parameters
cost_centerstring | Auf eine Sphaere eingrenzen |
Responses
200Bilanz nach § 266 HGB
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_balance_sheet"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getHgbBalanceSheet('42');
if (result.success) {
print(result.data);
}Gewinn- und Verlustrechnung in der Staffelform des § 275 Abs. 2 HGB.
GET/api/invoice/accounting/{identifier}/hgb_profit_and_loss
Path parameters
identifierrequiredstring |
Query parameters
cost_centerstring |
Responses
200GuV nach § 275 Abs. 2 HGB
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/hgb_profit_and_loss"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getHgbProfitAndLoss('42');
if (result.success) {
print(result.data);
}Offene Posten - Debitoren und Kreditoren mit Faelligkeitsstaffel.
GET/api/invoice/accounting/open_items
Was noch nicht bezahlt ist, und seit wann. Die Staffel sagt, welche Handlung ein Posten verlangt: zehn Tage ueberfaellig wird gemahnt, neunzig Tage ueberfaellig wird wertberichtigt.
Query parameters
as_ofstring | Stichtag, Vorgabe heute |
Responses
200Offene Posten beider Seiten
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/open_items \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/open_items', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/open_items"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/open_items', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/open_items"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/open_items")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/open_items"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getOpenItems();
if (result.success) {
print(result.data);
}Datentraegerueberlassung nach § 147 Abs. 6 AO.
GET/api/invoice/accounting/{identifier}/gobd_export
Der Export, nach dem eine Betriebspruefung fragt: die steuerrelevanten Daten in maschinell auswertbarer Form, samt der index.xml des GoBD-Beschreibungsstandards. Ohne sie waere ein CSV-Ordner kein Export, sondern ein Haufen Dateien.
Ausgegeben werden nur festgeschriebene Buchungen - Entwuerfe sind keine Buchfuehrung.
Path parameters
identifierrequiredstring |
Responses
200ZIP mit index.xml und den Datendateien
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/gobd_export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getDownloadLinkGobdExport('42');
print(result);Zeitabhaengige steuerliche Wertgrenzen eines Jahres.
GET/api/invoice/accounting/tax_thresholds
Freigrenze des wirtschaftlichen Geschaeftsbetriebs, Zweckbetriebsgrenze, Uebungsleiterfreibetrag und Ehrenamtspauschale - je mit Fundstelle, Anwendungsjahr und Verlauf.
Query parameters
yearstring | Jahr, Vorgabe das laufende |
Responses
200Die Wertgrenzen des Jahres
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/tax_thresholds"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getTaxThresholds();
if (result.success) {
print(result.data);
}Katalog der bilanziellen Abschlussarbeiten.
GET/api/invoice/accounting/year_end_adjustments
Welche Umbuchungen zum Jahresabschluss gehoeren, auf welche Konten sie laufen und woher sie kommen. Der Dienst rechnet nichts aus - wie hoch eine Rueckstellung ist, entscheidet ein Mensch -, aber er kennt die Konten und die richtige Seite.
Responses
200Die Abschlussbuchungen des eingestellten Kontenrahmens
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/accounting/year_end_adjustments'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Checkliste der Abschlussarbeiten eines Geschaeftsjahres.
GET/api/invoice/accounting/{identifier}/year_end_checklist
Keine Blocker: eine Rueckstellung laesst sich nicht erzwingen, und ein Betrieb ohne Warenlager braucht keine Inventur. Die Liste sagt, woran zu denken ist, und ob im Jahr schon etwas davon gebucht wurde.
Path parameters
identifierrequiredstring |
Responses
200Checkliste mit dem Stand des Jahres
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_checklist"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getYearEndChecklist('42');
if (result.success) {
print(result.data);
}Bucht eine Abschlussbuchung.
POST/api/invoice/accounting/{identifier}/year_end_adjustment
Path parameters
identifierrequiredstring |
Request body application/json
typestringrequiredamountstringrequireddescriptionstringrequiredcounter_accountstringentry_datestringtax_ratestringcost_centerstringdocument_numberstring
Responses
201Der gebuchte Satz
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"type": "string",
"amount": "string",
"description": "Text",
"counter_account": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"tax_rate": "string"
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
type: 'string',
amount: 'string',
description: 'Text',
counter_account: 'string',
entry_date: '2026-10-15T09:30:00+02:00',
tax_rate: 'string'
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment"
payload = {
"type": "string",
"amount": "string",
"description": "Text",
"counter_account": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"tax_rate": "string"
}
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment', [
'body' => '{"type":"string","amount":"string","description":"Text","counter_account":"string","entry_date":"2026-10-15T09:30:00+02:00","tax_rate":"string"}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"type\":\"string\",\"amount\":\"string\",\"description\":\"Text\",\"counter_account\":\"string\",\"entry_date\":\"2026-10-15T09:30:00+02:00\",\"tax_rate\":\"string\"}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"type\":\"string\",\"amount\":\"string\",\"description\":\"Text\",\"counter_account\":\"string\",\"entry_date\":\"2026-10-15T09:30:00+02:00\",\"tax_rate\":\"string\"}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment"
payload := strings.NewReader("{\"type\":\"string\",\"amount\":\"string\",\"description\":\"Text\",\"counter_account\":\"string\",\"entry_date\":\"2026-10-15T09:30:00+02:00\",\"tax_rate\":\"string\"}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/accounting/42/year_end_adjustment'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"type": "string",
"amount": "string",
"description": "Text",
"counter_account": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"tax_rate": "string"
}),
);
print(response.body);Eine Auswertung als CSV.
GET/api/invoice/accounting/{identifier}/report.csv
Die Auswertungen selbst bleiben JSON - die Oberflaeche liest sie. Wer damit weiterrechnen will, holt sie hier: deutsches Format mit Semikolon und Komma, damit Excel die Zahlen als Zahlen liest und nicht als Text.
Path parameters
identifierrequiredstring |
Query parameters
reportstring | Welche Auswertung |
cost_centerstring | |
as_ofstring | Stichtag der offenen Posten |
Responses
200Die Auswertung als CSV
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/accounting/42/report.csv'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Was der Buchungsstapel enthalten wuerde - ohne ihn zu erzeugen.
GET/api/invoice/accounting/{identifier}/datev_export/preview
Die Kanzlei bekommt den Stapel einmal; wenn darin etwas fehlt, faellt es dort auf und nicht hier. Deshalb zuerst die Vorschau: wie viele Saetze es werden, und welche Buchungen sich nicht als Buchungssatz abbilden lassen, samt Grund. Was hier steht, muss die Kanzlei von Hand erfassen - besser sie weiss es vorher.
Path parameters
identifierrequiredstring |
Query parameters
fromstring | Beginn des Zeitraums, Vorgabe der Jahresbeginn |
tostring | Ende des Zeitraums, Vorgabe das Jahresende |
Responses
200Anzahl der Saetze und die uebersprungenen Buchungen
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export/preview"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getDatevExportPreview('42');
if (result.success) {
print(result.data);
}Der Buchungsstapel im DATEV-Format.
GET/api/invoice/accounting/{identifier}/datev_export
Die Datei, die eine Kanzlei in DATEV Kanzlei-Rechnungswesen einliest. Ausgegeben werden ausschliesslich festgeschriebene Buchungen - ein Entwurf ist keine Buchfuehrung, und ein Stapel mit Entwuerfen darin wuerde in der Kanzlei zu Buchungen, die es bei uns nie gab.
Path parameters
identifierrequiredstring |
Query parameters
fromstring | Beginn des Zeitraums, Vorgabe der Jahresbeginn |
tostring | Ende des Zeitraums, Vorgabe das Jahresende |
Responses
200Der Buchungsstapel als CSV im DATEV-Format
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/42/datev_export"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getDownloadLinkDatevExport('42');
print(result);Kontenblatt: alle Buchungszeilen eines Kontos mit laufendem Saldo.
GET/api/invoice/accounting/ledger/{identifier}
Ohne chart_of_accounts wird der Bezeichner als Id gelesen. Das ist hier die einzige eindeutige Angabe: Kontonummern sind selbst Zahlen, und "1200" wäre sonst nicht zu unterscheiden von der Id 1200 - bei über tausend Konten je Rahmen fast immer ein anderes Konto, ohne dass es auffiele. Wer in Kontonummern denkt, gibt den Rahmen dazu an; innerhalb eines Rahmens ist die Nummer eindeutig.
Path parameters
identifierrequiredstring |
Query parameters
fiscal_yearstring | Geschäftsjahr |
chart_of_accountsstring | Den Bezeichner als Kontonummer dieses Rahmens lesen |
Responses
200Kontenblatt
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/accounting/ledger/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getLedger('42', fiscalYear: '…');
if (result.success) {
print(result.data);
}Sachkonten.
GET/api/invoice/ledger_account
Mit "search" wird über Nummer und Bezeichnung gesucht statt gefiltert. Ein voller Kontenrahmen hat über tausend Konten; eine Auswahlliste zum Durchblättern wäre unbrauchbar, und die übrigen Filter treffen nur exakt. Die Trefferzahl ist begrenzt - wer sucht, will die ersten passenden sehen, nicht alle.
Query parameters
idstring | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
numberstring | Kontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können. |
namestring | |
chartOfAccountsstring | |
accountTypestring | |
defaultTaxstring | Steuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung. |
taxAccountstring | Gegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen. |
expenseCategorystring | Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt. |
costCenterRequiredboolean | Ob auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht. |
isSystemboolean | Vom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden. |
isActiveboolean | Konten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden. |
createdstring | |
updatedstring | |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Sachkontenarray<LedgerAccount>
Show fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
Show fields (6)
idintegerPrimary key of the tax rate. Internal ID.
namestringrequiredName of the tax rate, for example 19 percent.
valuenumber (float)Tax rate in percent.
deletedbooleanThe tax rate is deleted.
global_defaultbooleanDefault tax rate for new items.
datev_tax_keyintegerDATEV Steuerschlüssel für Umsatzsteuer (Ausgangsrechnungen). Wird von BuchhaltungsButler und DATEV-Export genutzt. Standardwerte: 0 = Kein Steuerausweis (0%) 2 = Umsatzsteuer 7% (ermäßigt) 3 = Umsatzsteuer 19% (Regelsteuersatz) Für Vorsteuer (Eingangsrechnungen) gibt es eine spiegelbildliche Zuordnung: 0 = Keine Vorsteuer (0%) 5 = Vorsteuer 7% 8 = Vorsteuer 19%
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
Show fields (19)
idintegerPrimary key of the expense category. Internal ID.
codestringKurzbezeichnung/Code (z.B. "WAREN", "PERSONAL", "MIETE")
eur_line_numberintegerZeile in der Anlage EÜR (z.B. 23 für Wareneinkauf)
eur_line_namestringBezeichnung der EÜR-Zeile (z.B. "Waren, Rohstoffe und Hilfsstoffe")
category_typestringTyp der Kategorie (expense, income, neutral, asset, private)
default_taxTaxStandard-Steuersatz für diese Kategorie
cost_centerCostCenterKostenstelle der Kategorie - bei Vereinen die steuerliche Sphäre. Ein Beleg trägt keine eigene Sphäre; über seine Kategorie bekommt er eine. Die EÜR des wirtschaftlichen Geschäftsbetriebs liest sie (billing_euer_commercial_sphere_only), die automatische Buchung setzt sie auf die Buchungszeilen (billing_accounting_cost_center_from_category).
is_vat_deductiblebooleanIst Vorsteuerabzug möglich?
is_immediate_deductionbooleanIst die Kategorie sofort abzugsfähig? (vs. Abschreibung über mehrere Jahre)
depreciation_yearsintegerAbschreibungsdauer in Jahren (für Anlagevermögen)
sort_orderintegerSortierreihenfolge
is_activebooleanIst die Kategorie aktiv/sichtbar?
colorstringFarbe für UI-Darstellung (Hex-Code)
iconstringIcon-Name für UI-Darstellung
is_systembooleanIst dies eine System-Kategorie? (nicht löschbar)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/ledger_account \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/ledger_account', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/ledger_account"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/ledger_account', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/ledger_account"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/ledger_account")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/ledger_account"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await LedgerAccountController.getAll();
if (result.success) {
print(result.data);
}[
{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"expense_category": {
"id": 42,
"eur_line_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"code": "string",
"eur_line_number": 1,
"category_type": "string",
"is_vat_deductible": true,
"is_immediate_deduction": true,
"depreciation_years": 1
},
"cost_center_required": true,
"is_system": true
}
]Creates a new ledger account entry.
POST/api/invoice/ledger_account
Request body application/json
dataLedgerAccountShow fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Sachkonto anlegenLedgerAccount
Show fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
Show fields (6)
idintegerPrimary key of the tax rate. Internal ID.
namestringrequiredName of the tax rate, for example 19 percent.
valuenumber (float)Tax rate in percent.
deletedbooleanThe tax rate is deleted.
global_defaultbooleanDefault tax rate for new items.
datev_tax_keyintegerDATEV Steuerschlüssel für Umsatzsteuer (Ausgangsrechnungen). Wird von BuchhaltungsButler und DATEV-Export genutzt. Standardwerte: 0 = Kein Steuerausweis (0%) 2 = Umsatzsteuer 7% (ermäßigt) 3 = Umsatzsteuer 19% (Regelsteuersatz) Für Vorsteuer (Eingangsrechnungen) gibt es eine spiegelbildliche Zuordnung: 0 = Keine Vorsteuer (0%) 5 = Vorsteuer 7% 8 = Vorsteuer 19%
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
Show fields (19)
idintegerPrimary key of the expense category. Internal ID.
codestringKurzbezeichnung/Code (z.B. "WAREN", "PERSONAL", "MIETE")
eur_line_numberintegerZeile in der Anlage EÜR (z.B. 23 für Wareneinkauf)
eur_line_namestringBezeichnung der EÜR-Zeile (z.B. "Waren, Rohstoffe und Hilfsstoffe")
category_typestringTyp der Kategorie (expense, income, neutral, asset, private)
default_taxTaxStandard-Steuersatz für diese Kategorie
cost_centerCostCenterKostenstelle der Kategorie - bei Vereinen die steuerliche Sphäre. Ein Beleg trägt keine eigene Sphäre; über seine Kategorie bekommt er eine. Die EÜR des wirtschaftlichen Geschäftsbetriebs liest sie (billing_euer_commercial_sphere_only), die automatische Buchung setzt sie auf die Buchungszeilen (billing_accounting_cost_center_from_category).
is_vat_deductiblebooleanIst Vorsteuerabzug möglich?
is_immediate_deductionbooleanIst die Kategorie sofort abzugsfähig? (vs. Abschreibung über mehrere Jahre)
depreciation_yearsintegerAbschreibungsdauer in Jahren (für Anlagevermögen)
sort_orderintegerSortierreihenfolge
is_activebooleanIst die Kategorie aktiv/sichtbar?
colorstringFarbe für UI-Darstellung (Hex-Code)
iconstringIcon-Name für UI-Darstellung
is_systembooleanIst dies eine System-Kategorie? (nicht löschbar)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/ledger_account \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
chart_of_accounts: 'string',
account_type: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/ledger_account', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/ledger_account"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/ledger_account', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","chart_of_accounts":"string","account_type":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/ledger_account"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/ledger_account")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/ledger_account"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/ledger_account.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await LedgerAccountController.post(LedgerAccount.fromJson({
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}));
if (result.success) {
print(result.data);
}{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"expense_category": {
"id": 42,
"eur_line_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"code": "string",
"eur_line_number": 1,
"category_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"cost_center": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_vat_deductible": true
},
"cost_center_required": true,
"is_system": true
}Returns a single ledger account entry.
GET/api/invoice/ledger_account/{identifier}
Path parameters
identifierrequiredstring |
Responses
200SachkontoLedgerAccount
Show fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
Show fields (6)
idintegerPrimary key of the tax rate. Internal ID.
namestringrequiredName of the tax rate, for example 19 percent.
valuenumber (float)Tax rate in percent.
deletedbooleanThe tax rate is deleted.
global_defaultbooleanDefault tax rate for new items.
datev_tax_keyintegerDATEV Steuerschlüssel für Umsatzsteuer (Ausgangsrechnungen). Wird von BuchhaltungsButler und DATEV-Export genutzt. Standardwerte: 0 = Kein Steuerausweis (0%) 2 = Umsatzsteuer 7% (ermäßigt) 3 = Umsatzsteuer 19% (Regelsteuersatz) Für Vorsteuer (Eingangsrechnungen) gibt es eine spiegelbildliche Zuordnung: 0 = Keine Vorsteuer (0%) 5 = Vorsteuer 7% 8 = Vorsteuer 19%
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
Show fields (19)
idintegerPrimary key of the expense category. Internal ID.
codestringKurzbezeichnung/Code (z.B. "WAREN", "PERSONAL", "MIETE")
eur_line_numberintegerZeile in der Anlage EÜR (z.B. 23 für Wareneinkauf)
eur_line_namestringBezeichnung der EÜR-Zeile (z.B. "Waren, Rohstoffe und Hilfsstoffe")
category_typestringTyp der Kategorie (expense, income, neutral, asset, private)
default_taxTaxStandard-Steuersatz für diese Kategorie
cost_centerCostCenterKostenstelle der Kategorie - bei Vereinen die steuerliche Sphäre. Ein Beleg trägt keine eigene Sphäre; über seine Kategorie bekommt er eine. Die EÜR des wirtschaftlichen Geschäftsbetriebs liest sie (billing_euer_commercial_sphere_only), die automatische Buchung setzt sie auf die Buchungszeilen (billing_accounting_cost_center_from_category).
is_vat_deductiblebooleanIst Vorsteuerabzug möglich?
is_immediate_deductionbooleanIst die Kategorie sofort abzugsfähig? (vs. Abschreibung über mehrere Jahre)
depreciation_yearsintegerAbschreibungsdauer in Jahren (für Anlagevermögen)
sort_orderintegerSortierreihenfolge
is_activebooleanIst die Kategorie aktiv/sichtbar?
colorstringFarbe für UI-Darstellung (Hex-Code)
iconstringIcon-Name für UI-Darstellung
is_systembooleanIst dies eine System-Kategorie? (nicht löschbar)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/ledger_account/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/ledger_account/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/ledger_account/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/ledger_account/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/ledger_account/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await LedgerAccountController.get('42');
if (result.success) {
print(result.data);
}{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"expense_category": {
"id": 42,
"eur_line_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"code": "string",
"eur_line_number": 1,
"category_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"cost_center": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_vat_deductible": true
},
"cost_center_required": true,
"is_system": true
}Updates an existing ledger account entry.
PUT/api/invoice/ledger_account/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataLedgerAccountShow fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Sachkonto ändernLedgerAccount
Show fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
Show fields (6)
idintegerPrimary key of the tax rate. Internal ID.
namestringrequiredName of the tax rate, for example 19 percent.
valuenumber (float)Tax rate in percent.
deletedbooleanThe tax rate is deleted.
global_defaultbooleanDefault tax rate for new items.
datev_tax_keyintegerDATEV Steuerschlüssel für Umsatzsteuer (Ausgangsrechnungen). Wird von BuchhaltungsButler und DATEV-Export genutzt. Standardwerte: 0 = Kein Steuerausweis (0%) 2 = Umsatzsteuer 7% (ermäßigt) 3 = Umsatzsteuer 19% (Regelsteuersatz) Für Vorsteuer (Eingangsrechnungen) gibt es eine spiegelbildliche Zuordnung: 0 = Keine Vorsteuer (0%) 5 = Vorsteuer 7% 8 = Vorsteuer 19%
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
Show fields (19)
idintegerPrimary key of the expense category. Internal ID.
codestringKurzbezeichnung/Code (z.B. "WAREN", "PERSONAL", "MIETE")
eur_line_numberintegerZeile in der Anlage EÜR (z.B. 23 für Wareneinkauf)
eur_line_namestringBezeichnung der EÜR-Zeile (z.B. "Waren, Rohstoffe und Hilfsstoffe")
category_typestringTyp der Kategorie (expense, income, neutral, asset, private)
default_taxTaxStandard-Steuersatz für diese Kategorie
cost_centerCostCenterKostenstelle der Kategorie - bei Vereinen die steuerliche Sphäre. Ein Beleg trägt keine eigene Sphäre; über seine Kategorie bekommt er eine. Die EÜR des wirtschaftlichen Geschäftsbetriebs liest sie (billing_euer_commercial_sphere_only), die automatische Buchung setzt sie auf die Buchungszeilen (billing_accounting_cost_center_from_category).
is_vat_deductiblebooleanIst Vorsteuerabzug möglich?
is_immediate_deductionbooleanIst die Kategorie sofort abzugsfähig? (vs. Abschreibung über mehrere Jahre)
depreciation_yearsintegerAbschreibungsdauer in Jahren (für Anlagevermögen)
sort_orderintegerSortierreihenfolge
is_activebooleanIst die Kategorie aktiv/sichtbar?
colorstringFarbe für UI-Darstellung (Hex-Code)
iconstringIcon-Name für UI-Darstellung
is_systembooleanIst dies eine System-Kategorie? (nicht löschbar)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/invoice/ledger_account/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
chart_of_accounts: 'string',
account_type: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/ledger_account/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/invoice/ledger_account/42', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","chart_of_accounts":"string","account_type":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/ledger_account/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/ledger_account/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/ledger_account.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await LedgerAccountController.put(LedgerAccount.fromJson({
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}));
if (result.success) {
print(result.data);
}{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"expense_category": {
"id": 42,
"eur_line_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"code": "string",
"eur_line_number": 1,
"category_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"cost_center": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_vat_deductible": true
},
"cost_center_required": true,
"is_system": true
}Updates an existing ledger account entry.
PATCH/api/invoice/ledger_account/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataLedgerAccountShow fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Sachkonto ändernLedgerAccount
Show fields (15)
display_namestringidintegerPrimary key of the ledger account. Internal ID.
numberstringKontonummer im Kontenrahmen, z.B. "1200" (SKR03 Bank) oder "40000" (SKR42). Als String geführt, weil SKR42 fünfstellig ist und führende Nullen bedeutungstragend sein können.
chart_of_accountsstringChart of accounts the account belongs to, for example SKR03.
account_typestringType of the account, for example asset or revenue.
default_taxTaxSteuersatz, der beim Buchen auf dieses Konto vorgeschlagen wird. Bei Erlös- und Aufwandskonten ist der Satz durch die Kontonummer vorgegeben (etwa "Erlöse 19% USt"), deshalb hängt er am Konto und nicht an der einzelnen Buchung.
Show fields (6)
idintegerPrimary key of the tax rate. Internal ID.
namestringrequiredName of the tax rate, for example 19 percent.
valuenumber (float)Tax rate in percent.
deletedbooleanThe tax rate is deleted.
global_defaultbooleanDefault tax rate for new items.
datev_tax_keyintegerDATEV Steuerschlüssel für Umsatzsteuer (Ausgangsrechnungen). Wird von BuchhaltungsButler und DATEV-Export genutzt. Standardwerte: 0 = Kein Steuerausweis (0%) 2 = Umsatzsteuer 7% (ermäßigt) 3 = Umsatzsteuer 19% (Regelsteuersatz) Für Vorsteuer (Eingangsrechnungen) gibt es eine spiegelbildliche Zuordnung: 0 = Keine Vorsteuer (0%) 5 = Vorsteuer 7% 8 = Vorsteuer 19%
tax_accountLedgerAccountGegenkonto für die Steuer, die beim Buchen auf dieses Konto entsteht. Bei Erlöskonten das Umsatzsteuerkonto, bei Aufwandskonten das Vorsteuerkonto. Damit lässt sich aus einem Bruttobetrag automatisch der dreizeilige Buchungssatz erzeugen.
expense_categoryExpenseCategory10Brücke zur EÜR: auf welcher Zeile der Anlage EÜR dieses Konto zählt. Erlaubt es, beide Gewinnermittlungsarten aus denselben Belegen zu bedienen - etwa im Wechseljahr oder wenn ein Verein den wirtschaftlichen Geschäftsbetrieb per EÜR und den Rest bilanziell führt.
Show fields (19)
idintegerPrimary key of the expense category. Internal ID.
codestringKurzbezeichnung/Code (z.B. "WAREN", "PERSONAL", "MIETE")
eur_line_numberintegerZeile in der Anlage EÜR (z.B. 23 für Wareneinkauf)
eur_line_namestringBezeichnung der EÜR-Zeile (z.B. "Waren, Rohstoffe und Hilfsstoffe")
category_typestringTyp der Kategorie (expense, income, neutral, asset, private)
default_taxTaxStandard-Steuersatz für diese Kategorie
cost_centerCostCenterKostenstelle der Kategorie - bei Vereinen die steuerliche Sphäre. Ein Beleg trägt keine eigene Sphäre; über seine Kategorie bekommt er eine. Die EÜR des wirtschaftlichen Geschäftsbetriebs liest sie (billing_euer_commercial_sphere_only), die automatische Buchung setzt sie auf die Buchungszeilen (billing_accounting_cost_center_from_category).
is_vat_deductiblebooleanIst Vorsteuerabzug möglich?
is_immediate_deductionbooleanIst die Kategorie sofort abzugsfähig? (vs. Abschreibung über mehrere Jahre)
depreciation_yearsintegerAbschreibungsdauer in Jahren (für Anlagevermögen)
sort_orderintegerSortierreihenfolge
is_activebooleanIst die Kategorie aktiv/sichtbar?
colorstringFarbe für UI-Darstellung (Hex-Code)
iconstringIcon-Name für UI-Darstellung
is_systembooleanIst dies eine System-Kategorie? (nicht löschbar)
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
cost_center_requiredbooleanOb auf diesem Konto eine Kostenstelle angegeben werden muss. Der SKR42 bildet die vier steuerlichen Sphären eines gemeinnützigen Vereins über Kostenstellen ab, nicht über getrennte Konten. Für die Erfolgskonten ist die Angabe dort deshalb Pflicht.
is_systembooleanVom Kontenrahmen-Initialisierer angelegt. Nummer und Art sind dann durch den Rahmen vorgegeben und sollten nicht geändert werden.
is_activebooleanKonten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/invoice/ledger_account/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
chart_of_accounts: 'string',
account_type: 'string'
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/ledger_account/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/invoice/ledger_account/42', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","chart_of_accounts":"string","account_type":"string"}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/ledger_account/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/ledger_account/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/ledger_account/42"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"chart_of_accounts\":\"string\",\"account_type\":\"string\"}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/ledger_account/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string"
}
}),
);
print(response.body);{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"chart_of_accounts": "string",
"account_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"expense_category": {
"id": 42,
"eur_line_name": "Beispiel",
"color": "#3f5efb",
"name": "Beispiel",
"code": "string",
"eur_line_number": 1,
"category_type": "string",
"default_tax": {
"name": "Beispiel",
"id": 42,
"value": 1.5,
"deleted": true,
"global_default": true,
"datev_tax_key": 1
},
"cost_center": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
},
"is_vat_deductible": true
},
"cost_center_required": true,
"is_system": true
}Returns a list of cost center entries.
GET/api/invoice/cost_center
Query parameters
idstring | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
numberstring | |
namestring | |
spherestring | Steuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung. |
isSystemboolean | |
isActiveboolean | |
createdstring | |
updatedstring | |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Kostenstellenarray<CostCenter>
Show fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/cost_center \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/cost_center', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/cost_center"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/cost_center', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/cost_center"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/cost_center")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/cost_center"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/cost_center_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await CostCenterController.getAll();
if (result.success) {
print(result.data);
}[
{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}
]Creates a new cost center entry.
POST/api/invoice/cost_center
Request body application/json
dataCostCenterShow fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Kostenstelle anlegenCostCenter
Show fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/cost_center \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
sphere: 'string',
is_system: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/cost_center', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/cost_center"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/cost_center', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","sphere":"string","is_system":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/cost_center"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/cost_center")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/cost_center"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/cost_center_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/cost_center.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await CostCenterController.post(CostCenter.fromJson({
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}));
if (result.success) {
print(result.data);
}{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Returns a single cost center entry.
GET/api/invoice/cost_center/{identifier}
Path parameters
identifierrequiredstring |
Responses
200KostenstelleCostCenter
Show fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/cost_center/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/cost_center/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/cost_center/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/cost_center/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/cost_center/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/cost_center/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Updates an existing cost center entry.
PUT/api/invoice/cost_center/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataCostCenterShow fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Kostenstelle ändernCostCenter
Show fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/invoice/cost_center/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
sphere: 'string',
is_system: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/cost_center/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/invoice/cost_center/42', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","sphere":"string","is_system":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/cost_center/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/cost_center/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/cost_center_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/cost_center.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await CostCenterController.put(CostCenter.fromJson({
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}));
if (result.success) {
print(result.data);
}{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Updates an existing cost center entry.
PATCH/api/invoice/cost_center/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataCostCenterShow fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Kostenstelle ändernCostCenter
Show fields (10)
display_namestringidintegerPrimary key of the cost center. Internal ID.
numberstringNumber of the cost center.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanThe cost center is created by the system and cannot be deleted.
is_activebooleanThe cost center is active.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/invoice/cost_center/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
display_name: 'Beispiel',
id: 42,
name: 'Beispiel',
number: 'string',
sphere: 'string',
is_system: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/cost_center/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
payload = { "data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/invoice/cost_center/42', [
'body' => '{"data":{"display_name":"Beispiel","id":42,"name":"Beispiel","number":"string","sphere":"string","is_system":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/cost_center/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/cost_center/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/cost_center/42"
payload := strings.NewReader("{\"data\":{\"display_name\":\"Beispiel\",\"id\":42,\"name\":\"Beispiel\",\"number\":\"string\",\"sphere\":\"string\",\"is_system\":true}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/cost_center/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true
}
}),
);
print(response.body);{
"display_name": "Beispiel",
"id": 42,
"name": "Beispiel",
"number": "string",
"sphere": "string",
"is_system": true,
"is_active": true,
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}Returns a list of fiscal year entries.
GET/api/invoice/fiscal_year
Query parameters
idstring | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
namestring | |
startDatestring | |
endDatestring | |
statusstring | |
openingBalanceEnteredboolean | Ob die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht. |
closingEntrystring | Die Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen. |
closedAtstring | |
closedBystring | |
createdstring | |
updatedstring | |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Geschaeftsjahrearray<FiscalYear>
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
linesarray<JournalEntryLine>Lines of the entry.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"closing_entry": {
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"period": 1
},
"deleted": true
}
]Creates a new fiscal year entry.
POST/api/invoice/fiscal_year
Request body application/json
dataFiscalYearShow fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Geschaeftsjahr anlegenFiscalYear
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
linesarray<JournalEntryLine>Lines of the entry.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
start_date: '2026-10-15T09:30:00+02:00',
end_date: '2026-10-15T09:30:00+02:00',
status: 'string',
opening_balance_entered: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year', [
'body' => '{"data":{"id":42,"name":"Beispiel","start_date":"2026-10-15T09:30:00+02:00","end_date":"2026-10-15T09:30:00+02:00","status":"string","opening_balance_entered":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/fiscal_year.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.post(FiscalYear.fromJson({
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"closing_entry": {
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"period": 1
},
"deleted": true
}Returns a single fiscal year entry.
GET/api/invoice/fiscal_year/{identifier}
Path parameters
identifierrequiredstring |
Responses
200GeschaeftsjahrFiscalYear
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
linesarray<JournalEntryLine>Lines of the entry.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42 \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"closing_entry": {
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"period": 1
},
"deleted": true
}Updates an existing fiscal year entry.
PUT/api/invoice/fiscal_year/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataFiscalYearShow fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Geschaeftsjahr ändernFiscalYear
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
linesarray<JournalEntryLine>Lines of the entry.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PUT \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}
}
'const options = {
method: 'PUT',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
start_date: '2026-10-15T09:30:00+02:00',
end_date: '2026-10-15T09:30:00+02:00',
status: 'string',
opening_balance_entered: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PUT', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', [
'body' => '{"data":{"id":42,"name":"Beispiel","start_date":"2026-10-15T09:30:00+02:00","end_date":"2026-10-15T09:30:00+02:00","status":"string","opening_balance_entered":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Put,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42")
.put(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.put(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}
}),
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"closing_entry": {
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"period": 1
},
"deleted": true
}Updates an existing fiscal year entry.
PATCH/api/invoice/fiscal_year/{identifier}
Path parameters
identifierrequiredstring |
Request body application/json
dataFiscalYearShow fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
Responses
200Geschaeftsjahr ändernFiscalYear
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
linesarray<JournalEntryLine>Lines of the entry.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request PATCH \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42 \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}
}
'const options = {
method: 'PATCH',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({
data: {
id: 42,
name: 'Beispiel',
start_date: '2026-10-15T09:30:00+02:00',
end_date: '2026-10-15T09:30:00+02:00',
status: 'string',
opening_balance_entered: true
}
})
};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
payload = { "data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": True
} }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('PATCH', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42', [
'body' => '{"data":{"id":42,"name":"Beispiel","start_date":"2026-10-15T09:30:00+02:00","end_date":"2026-10-15T09:30:00+02:00","status":"string","opening_balance_entered":true}}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Patch,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42")
.patch(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42"
payload := strings.NewReader("{\"data\":{\"id\":42,\"name\":\"Beispiel\",\"start_date\":\"2026-10-15T09:30:00+02:00\",\"end_date\":\"2026-10-15T09:30:00+02:00\",\"status\":\"string\",\"opening_balance_entered\":true}}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with package:http (no controller in the iw_erp_api package)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42'),
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: jsonEncode({
"data": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true
}
}),
);
print(response.body);{
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"crm_person": {
"id": 42,
"first_name": "Lena",
"last_name": "Hartmann",
"title": "Beispiel",
"language": "de",
"support_description": "Text",
"profile_picture_url": "https://vynst.de",
"address_street": "Jakobistr. 39",
"address_city": "Hannover",
"address_zip": "30163"
},
"archived": true,
"require2fa": true,
"search_string": "string"
},
"closing_entry": {
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"period": 1
},
"deleted": true
}Was einem Abschluss noch im Weg steht.
GET/api/invoice/fiscal_year/{identifier}/closing_blockers
Wird vor dem Abschluss angezeigt, damit niemand gegen eine Ausnahme laeuft.
Path parameters
identifierrequiredstring |
Responses
200Offene Punkte vor dem Abschluss
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/closing_blockers"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.getClosingBlockers('42');
if (result.success) {
print(result.data);
}Geschaeftsjahr abschliessen.
POST/api/invoice/fiscal_year/{identifier}/close
Schliesst die Erfolgskonten ueber das Ergebnis auf das Eigenkapital ab. Vorlaeufig laesst sich das Jahr noch einmal oeffnen, endgueltig nicht.
Path parameters
identifierrequiredstring |
Request body application/json
chartstringprovisionalboolean
Responses
200Die erzeugte Abschlussbuchung
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"chart": "SKR04",
"provisional": true
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({chart: 'SKR04', provisional: true})
};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close"
payload = {
"chart": "SKR04",
"provisional": True
}
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close', [
'body' => '{"chart":"SKR04","provisional":true}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"chart\":\"SKR04\",\"provisional\":true}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"chart\":\"SKR04\",\"provisional\":true}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/close"
payload := strings.NewReader("{\"chart\":\"SKR04\",\"provisional\":true}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.close('42');
if (result.success) {
print(result.data);
}Ein vorlaeufig abgeschlossenes Jahr wieder oeffnen.
POST/api/invoice/fiscal_year/{identifier}/reopen
Path parameters
identifierrequiredstring |
Responses
200Das wieder geoeffnete Geschaeftsjahr
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'POST', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen")
.post(null)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/reopen"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.reopen('42');
if (result.success) {
print(result.data);
}Saldenvortrag ins Folgejahr.
POST/api/invoice/fiscal_year/{identifier}/carry_forward
Uebertraegt die Bestaende der Bilanzkonten - ohne diesen Schritt begaenne das neue Jahr mit leeren Konten.
Path parameters
identifierrequiredstring |
Request body application/json
target_fiscal_yearstringchartstring
Responses
200Die erzeugte Eroeffnungsbuchung
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"target_fiscal_year": "2027",
"chart": "SKR04"
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({target_fiscal_year: '2027', chart: 'SKR04'})
};
fetch('https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward"
payload = {
"target_fiscal_year": "2027",
"chart": "SKR04"
}
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward', [
'body' => '{"target_fiscal_year":"2027","chart":"SKR04"}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"target_fiscal_year\":\"2027\",\"chart\":\"SKR04\"}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"target_fiscal_year\":\"2027\",\"chart\":\"SKR04\"}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/fiscal_year/42/carry_forward"
payload := strings.NewReader("{\"target_fiscal_year\":\"2027\",\"chart\":\"SKR04\"}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.carryForward('42', targetFiscalYear: '…');
if (result.success) {
print(result.data);
}Journal - alle Buchungssätze.
GET/api/invoice/journal_entry
Query parameters
idstring | |
deletedboolean | This property is used to mark an entity as deleted / archived | Default value: false |
entryNumberstring | Fortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen. |
entryDatestring | Buchungsdatum - bestimmt, in welche Periode die Buchung fällt. |
documentDatestring | Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen. |
documentNumberstring | Belegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg"). |
fiscalYearstring | |
periodstring | Buchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht. |
statusstring | |
sourceTypestring | |
sourceIdstring | Id des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird. |
reversalOfstring | Die Buchung, die durch diese hier storniert wird. |
postedAtstring | |
postedBystring | |
createdstring | |
updatedstring | |
searchStringstring | text to search for in the list |
orderFieldNamestring | name of the order field |
orderFieldSortstring | sorting modeAllowed: DESCASC |
pageinteger | page of the list |
pageSizeinteger | number of entries for each page |
withMaxPageNumberstring | returns the number of pages available as a header if this is set |
Responses
200Buchungssätzearray<JournalEntry>
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
linesarray<JournalEntryLine>Lines of the entry.
Show fields (9)
idintegerPrimary key of the journal entry line. Internal ID.
ledger_accountLedgerAccountLedger account that is booked.
cost_centerCostCenterCost center of the booking.
debitnumber (float)Sollbetrag. Aktiv- und Aufwandskonten mehren sich hier. DECIMAL und nicht DOUBLE. Ein binaerer Fliesskommawert kann 0,10 Euro nicht darstellen; bei einer einzelnen Buchung faellt das durch das Runden auf Cent nicht auf, ueber eine Summenspalte mit zehntausend Zeilen schon. Die Datenbank rechnet DECIMAL exakt, und genau ueber diese Spalten laufen die Summen der Saldenliste. Nach aussen bleibt es float: Doctrine liefert DECIMAL als Zeichenkette, die Getter wandeln um, und die Setter schreiben sie auf zwei Nachkommastellen normiert zurueck.
creditnumber (float)Habenbetrag. Passiv-, Eigenkapital- und Ertragskonten mehren sich hier.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition of the line in the journal entry.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/journal_entry \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/journal_entry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/journal_entry"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/journal_entry', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/journal_entry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/journal_entry")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/journal_entry"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await JournalEntryController.getAll();
if (result.success) {
print(result.data);
}[
{
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"fiscal_year": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"deleted": true,
"created": "2026-10-15T09:30:00+02:00",
"updated": "2026-10-15T09:30:00+02:00"
}
}
]Buchungssatz erfassen.
POST/api/invoice/journal_entry
Der Satz entsteht als Entwurf. Erst das Festschreiben macht ihn unveränderlich.
Request body application/json
dataobjectlinesarray<object>
Responses
200Buchungssatz anlegenJournalEntry
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
linesarray<JournalEntryLine>Lines of the entry.
Show fields (9)
idintegerPrimary key of the journal entry line. Internal ID.
ledger_accountLedgerAccountLedger account that is booked.
cost_centerCostCenterCost center of the booking.
debitnumber (float)Sollbetrag. Aktiv- und Aufwandskonten mehren sich hier. DECIMAL und nicht DOUBLE. Ein binaerer Fliesskommawert kann 0,10 Euro nicht darstellen; bei einer einzelnen Buchung faellt das durch das Runden auf Cent nicht auf, ueber eine Summenspalte mit zehntausend Zeilen schon. Die Datenbank rechnet DECIMAL exakt, und genau ueber diese Spalten laufen die Summen der Saldenliste. Nach aussen bleibt es float: Doctrine liefert DECIMAL als Zeichenkette, die Getter wandeln um, und die Setter schreiben sie auf zwei Nachkommastellen normiert zurueck.
creditnumber (float)Habenbetrag. Passiv-, Eigenkapital- und Ertragskonten mehren sich hier.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition of the line in the journal entry.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/journal_entry \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '{"lines":[{}]}'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({lines: [{}]})
};
fetch('https://your-instance.iw-erp.de/api/invoice/journal_entry', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/journal_entry"
payload = { "lines": [{}] }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/journal_entry', [
'body' => '{"lines":[{}]}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/journal_entry"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"lines\":[{}]}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"lines\":[{}]}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/journal_entry")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/journal_entry"
payload := strings.NewReader("{\"lines\":[{}]}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
import 'package:iw_erp_api/model/journal_entry.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await JournalEntryController.post(JournalEntry.fromJson({
"lines": [
{}
]
}));
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"fiscal_year": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"deleted": true,
"created": "2026-10-15T09:30:00+02:00"
}
}Prüfen, ohne zu speichern.
GET/api/invoice/journal_entry/{identifier}/validate
Path parameters
identifierrequiredstring |
Responses
200Gefundene Mängel, leer wenn buchbar
curl --request GET \
--url https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate \
--header 'x-iw-jwt-token: <TOKEN>'const options = {method: 'GET', headers: {'x-iw-jwt-token': '<TOKEN>'}};
fetch('https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate"
headers = {"x-iw-jwt-token": "<TOKEN>"}
response = requests.get(url, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate', [
'headers' => [
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Get,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate")
.get()
.addHeader("x-iw-jwt-token", "<TOKEN>")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/journal_entry/42/validate"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await JournalEntryController.validate('42');
if (result.success) {
print(result.data);
}Buchungssatz stornieren.
POST/api/invoice/journal_entry/{identifier}/reverse
Erzeugt eine Gegenbuchung; die ursprüngliche bleibt unangetastet.
Path parameters
identifierrequiredstring |
Request body application/json
reversal_datestring (date)
Responses
200Die erzeugte StornobuchungJournalEntry
Show fields (21)
debit_totalnumber (float)Summe der Sollbeträge.
credit_totalnumber (float)Summe der Habenbeträge.
is_balancedbooleanSoll gleich Haben - die Grundregel der doppelten Buchführung.
idintegerPrimary key of the journal entry. Internal ID.
entry_numberstringFortlaufende Buchungsnummer, vergeben beim Festschreiben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen.
entry_datestring (date-time)Buchungsdatum - bestimmt, in welche Periode die Buchung fällt.
document_datestring (date-time)Belegdatum - das Datum auf dem Papier. Kann vom Buchungsdatum abweichen.
document_numberstringBelegnummer - die Brücke zwischen Buchung und Beleg. Ohne sie ist die Buchung nicht nachvollziehbar ("keine Buchung ohne Beleg").
fiscal_yearFiscalYearFiscal year the entry belongs to.
Show fields (12)
idintegerPrimary key of the fiscal year. Internal ID.
start_datestring (date-time)Start date of the fiscal year.
end_datestring (date-time)End date of the fiscal year.
statusstringStatus of the fiscal year, for example open or closed.
opening_balance_enteredbooleanOb die Eröffnungsbilanzwerte erfasst sind. Beim ersten Geschäftsjahr einer Installation - oder beim Wechsel von der EÜR zur Bilanzierung - müssen die Anfangsbestände einmalig eingebucht werden, sonst stimmt die Bilanz nicht.
closed_atstring (date-time)Time the fiscal year was closed.
closed_byUser14Login user who closed the fiscal year.
closing_entryJournalEntryDie Abschlussbuchung dieses Jahres. Ohne diesen Verweis war der vorläufige Abschluss eine Sackgasse: das Wiederöffnen setzte den Status zurück, die Buchung blieb stehen, und der endgültige Abschluss fand keine Salden mehr vor. Mit dem Verweis lässt sich die Buchung beim Wiederöffnen stornieren und der Abschluss beliebig oft wiederholen.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
periodintegerBuchungsperiode innerhalb des Geschäftsjahres. 1 bis 12 für die laufenden Monate, 13 für die Abschlussperiode. Die Zahl wird aus dem Buchungsdatum abgeleitet, sobald sie nicht ausdrücklich gesetzt ist - nur der Abschluss setzt sie selbst. Die Spalte heisst `accounting_period` und nicht `period`: MariaDB hält PERIOD seit der System-Versionierung (`PERIOD FOR SYSTEM_TIME`) als Schlüsselwort frei, und die Migration scheitert daran. Das Feld in PHP bleibt `period` - DQL und die JSON-Ausgabe ändern sich damit nicht.
statusstringStatus of the entry, for example draft or posted.
source_typestringSource of the entry, for example invoice or payment.
source_idintegerId des auslösenden Belegs, damit sich Buchung und Beleg gegenseitig finden - und damit derselbe Beleg nicht zweimal gebucht wird.
reversal_ofJournalEntryDie Buchung, die durch diese hier storniert wird.
posted_atstring (date-time)Time the entry was posted.
posted_byUser14Login user who posted the entry.
Show fields (10)
idintegerPrimary key of the user. Internal ID of the login user.
namestringDisplay name of the user. Shown in the UI and in audit entries.
usernamestringLogin name of the user. Must be unique across all users.
emailstringE-mail address of the user. Used for login notifications, password resets and as a login alias.
positioningeneralstringFree text describing the position or role of the user.
crm_personCRMPerson10CRM person linked to this login user. Connects the login account with the person record.
profile_picture_urlstringURL of the profile picture of the user.
archivedbooleanMarks the user as archived. Archived users are kept for history and are not active.
require2fabooleanTwo-factor authentication is required for this user.
search_stringstringText that the entity can be searched by.
linesarray<JournalEntryLine>Lines of the entry.
Show fields (9)
idintegerPrimary key of the journal entry line. Internal ID.
ledger_accountLedgerAccountLedger account that is booked.
cost_centerCostCenterCost center of the booking.
debitnumber (float)Sollbetrag. Aktiv- und Aufwandskonten mehren sich hier. DECIMAL und nicht DOUBLE. Ein binaerer Fliesskommawert kann 0,10 Euro nicht darstellen; bei einer einzelnen Buchung faellt das durch das Runden auf Cent nicht auf, ueber eine Summenspalte mit zehntausend Zeilen schon. Die Datenbank rechnet DECIMAL exakt, und genau ueber diese Spalten laufen die Summen der Saldenliste. Nach aussen bleibt es float: Doctrine liefert DECIMAL als Zeichenkette, die Getter wandeln um, und die Setter schreiben sie auf zwei Nachkommastellen normiert zurueck.
creditnumber (float)Habenbetrag. Passiv-, Eigenkapital- und Ertragskonten mehren sich hier.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition of the line in the journal entry.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
deletedbooleanThis property is used to mark an entity as deleted / archived
namestringName of the entity.
createdstring (date-time)Point in time the entity was created.
updatedstring (date-time)Point in time the entity was last updated.
curl --request POST \
--url https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse \
--header 'content-type: application/json' \
--header 'x-iw-jwt-token: <TOKEN>' \
--data '
{
"reversal_date": "2026-10-15"
}
'const options = {
method: 'POST',
headers: {'x-iw-jwt-token': '<TOKEN>', 'content-type': 'application/json'},
body: JSON.stringify({reversal_date: '2026-10-15'})
};
fetch('https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse"
payload = { "reversal_date": "2026-10-15" }
headers = {
"x-iw-jwt-token": "<TOKEN>",
"content-type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
require_once('vendor/autoload.php');
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse', [
'body' => '{"reversal_date":"2026-10-15"}',
'headers' => [
'content-type' => 'application/json',
'x-iw-jwt-token' => '<TOKEN>',
],
]);
echo $response->getBody();using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse"),
Headers =
{
{ "x-iw-jwt-token", "<TOKEN>" },
},
Content = new StringContent("{\"reversal_date\":\"2026-10-15\"}")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("application/json")
}
}
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"reversal_date\":\"2026-10-15\"}");
Request request = new Request.Builder()
.url("https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse")
.post(body)
.addHeader("x-iw-jwt-token", "<TOKEN>")
.addHeader("content-type", "application/json")
.build();
Response response = client.newCall(request).execute();package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://your-instance.iw-erp.de/api/invoice/journal_entry/42/reverse"
payload := strings.NewReader("{\"reversal_date\":\"2026-10-15\"}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-iw-jwt-token", "<TOKEN>")
req.Header.Add("content-type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Dart with the iw_erp_api package
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'your-instance.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await JournalEntryController.reverse('42');
if (result.success) {
print(result.data);
}{
"id": 42,
"name": "Beispiel",
"debit_total": 1.5,
"credit_total": 1.5,
"is_balanced": true,
"entry_number": "string",
"entry_date": "2026-10-15T09:30:00+02:00",
"document_date": "2026-10-15T09:30:00+02:00",
"document_number": "string",
"fiscal_year": {
"id": 42,
"name": "Beispiel",
"start_date": "2026-10-15T09:30:00+02:00",
"end_date": "2026-10-15T09:30:00+02:00",
"status": "string",
"opening_balance_entered": true,
"closed_at": "2026-10-15T09:30:00+02:00",
"closed_by": {
"id": 42,
"name": "Beispiel",
"username": "lena.hartmann@example.org",
"email": "lena.hartmann@example.org",
"profile_picture_url": "https://vynst.de",
"positioningeneral": "string",
"archived": true,
"require2fa": true,
"search_string": "string"
},
"deleted": true,
"created": "2026-10-15T09:30:00+02:00"
}
}