Bilanzierung
Der Vorschlag für die Eröffnungsbilanz eines Geschäftsjahres.
GET/api/invoice/opening_balance/{identifier}
Pfad-Parameter
identifierPflichtstring |
Antworten
200Vorschlag mit abgeleiteten Positionen und Übergangsgewinn
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/opening_balance_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
positionsarray<object>Felder anzeigen (4)
account_numberstringsidestringamountnumberlabelstring
Antworten
200Die erzeugte EröffnungsbuchungJournalEntry
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
linesarray<JournalEntryLine>Zeilen des Eintrags.
Felder anzeigen (9)
idintegerPrimärschlüssel der Buchungssatzzeile. Interne ID.
ledger_accountLedgerAccountHauptbuch-Konto, auf das gebucht wird.
cost_centerCostCenterKostenstelle der Buchung.
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 werden hier erhöht.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition der Zeile im Buchungssatz.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/opening_balance_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
cost_centerstring | Auf eine Sphäre eingrenzen |
Antworten
200Bilanz zum Stichtag
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
cost_centerstring |
Antworten
200Gewinn- und Verlustrechnung
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Antworten
200Summen- und Saldenliste
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Antworten
200Ergebnis je Sphäre
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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 gewöhnliche 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.
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
cost_centerstring | Auf eine Sphäre eingrenzen |
Antworten
200Bilanz nach § 266 HGB
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
cost_centerstring |
Antworten
200GuV nach § 275 Abs. 2 HGB
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getHgbProfitAndLoss('42');
if (result.success) {
print(result.data);
}Offene Posten - Debitoren und Kreditoren mit Fälligkeitsstaffel.
GET/api/invoice/accounting/open_items
Was noch nicht bezahlt ist, und seit wann. Die Staffel legt fest, welche Handlung ein Posten erfordert: zehn Tage überfällig wird gemahnt, neunzig Tage überfällig wird wertberichtigt.
Query-Parameter
as_ofstring | Stichtag, Vorgabe heute |
Antworten
200Offene Posten beider Seiten
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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 Betriebsprüfung fragt: die steuerrelevanten Daten in maschinell auswertbarer Form, samt der index.xml des GoBD-Beschreibungsstandards. Ohne sie wäre ein CSV-Ordner kein Export, sondern ein Haufen Dateien.
Ausgegeben werden nur festgeschriebene Buchungen - Entwürfe sind keine Buchführung.
Pfad-Parameter
identifierPflichtstring |
Antworten
200ZIP mit index.xml und den Datendateien
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await AccountingReportController.getDownloadLinkGobdExport('42');
print(result);Zeitabhängige 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-Parameter
yearstring | Jahr, Vorgabe das laufende |
Antworten
200Die Wertgrenzen des Jahres
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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 gehören, auf welche Konten sie laufen und woher sie kommen. Der Dienst rechnet nichts aus – wie hoch eine Rückstellung ist, entscheidet ein Mensch –, aber er kennt die Konten und die richtige Seite.
Antworten
200Die Abschlussbuchungen des eingestellten Kontenrahmens
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Antworten
200Checkliste mit dem Stand des Jahres
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
typestringPflichtamountstringPflichtdescriptionstringPflichtcounter_accountstringentry_datestringtax_ratestringcost_centerstringdocument_numberstring
Antworten
201Der gebuchte Satz
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.post(
Uri.parse('https://eure-instanz.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 Oberfläche 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.
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
reportstring | Welche Auswertung |
cost_centerstring | |
as_ofstring | Stichtag der offenen Posten |
Antworten
200Die Auswertung als CSV
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.iw-erp.de/api/invoice/accounting/42/report.csv'),
headers: {'x-iw-jwt-token': '<TOKEN>'},
);
print(response.body);Was der Buchungsstapel enthalten würde – ohne ihn zu erzeugen.
GET/api/invoice/accounting/{identifier}/datev_export/preview
Die Kanzlei bekommt den Stapel einmal; wenn darin etwas fehlt, fällt es dort auf und nicht hier. Deshalb zuerst die Vorschau: wie viele Sätze es werden, und welche Buchungen sich nicht als Buchungssatz abbilden lassen, samt Grund. Was hier steht, muss die Kanzlei von Hand erfassen - besser sie weiß es vorher.
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
fromstring | Beginn des Zeitraums, Standard ist der Jahresbeginn |
tostring | Ende des Zeitraums, Vorgabe das Jahresende |
Antworten
200Anzahl der Sätze und der übersprungenen Buchungen
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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 ausschließlich festgeschriebene Buchungen - ein Entwurf ist keine Buchführung, und ein Stapel mit Entwürfen darin würde in der Kanzlei zu Buchungen, die es bei uns nie gab.
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
fromstring | Beginn des Zeitraums, Standard ist der Jahresbeginn |
tostring | Ende des Zeitraums, Vorgabe das Jahresende |
Antworten
200Der Buchungsstapel als CSV im DATEV-Format
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Query-Parameter
fiscal_yearstring | Geschäftsjahr |
chart_of_accountsstring | Den Bezeichner als Kontonummer dieses Rahmens lesen |
Antworten
200Kontenblatt
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/accounting_report_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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-Parameter
idstring | |
deletedboolean | Diese Eigenschaft markiert eine Entität als gelöscht / archiviert | Benötigtes Zugriffsrecht: SCOPE | Standardwert: 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. | Benötigt Zugriffs-Tag: SCOPE |
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. | Benötigt Zugriffsrecht: SCOPE |
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. | Erforderliches Zugriffsrecht: SCOPE |
isActiveboolean | Konten lassen sich stilllegen, statt sie zu löschen - bebuchte Konten dürfen nicht verschwinden. | Benötigt Zugriffs-Tag: SCOPE |
createdstring | |
updatedstring | |
searchStringstring | Text, nach dem in der Liste gesucht wird |
orderFieldNamestring | Name des Bestellfelds |
orderFieldSortstring | SortiermodusErlaubt: DESCASC |
pageinteger | Seite der Liste |
pageSizeinteger | Anzahl der Einträge je Seite |
withMaxPageNumberstring | gibt die Anzahl verfügbarer Seiten als Header zurück, wenn dies gesetzt ist |
Antworten
200Sachkontenarray<LedgerAccount>
Felder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
Felder anzeigen (6)
idintegerPrimärschlüssel des Steuersatzes. Interne ID.
namestringPflichtName des Steuersatzes, zum Beispiel 19 Prozent.
valuenumber (float)Steuersatz in Prozent.
deletedbooleanDer Steuersatz wird gelöscht.
global_defaultbooleanStandard-Steuersatz für neue Artikel.
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.
Felder anzeigen (19)
idintegerPrimärschlüssel der Ausgabenkategorie. Interne 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)
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
}
]Legt einen neuen Sachkonto-Eintrag an.
POST/api/invoice/ledger_account
Request-Body application/json
dataLedgerAccountFelder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Sachkonto anlegenLedgerAccount
Felder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
Felder anzeigen (6)
idintegerPrimärschlüssel des Steuersatzes. Interne ID.
namestringPflichtName des Steuersatzes, zum Beispiel 19 Prozent.
valuenumber (float)Steuersatz in Prozent.
deletedbooleanDer Steuersatz wird gelöscht.
global_defaultbooleanStandard-Steuersatz für neue Artikel.
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.
Felder anzeigen (19)
idintegerPrimärschlüssel der Ausgabenkategorie. Interne 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)
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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
}Liefert einen einzelnen Eintrag zum Hauptbuchkonto.
GET/api/invoice/ledger_account/{identifier}
Pfad-Parameter
identifierPflichtstring |
Antworten
200SachkontoLedgerAccount
Felder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
Felder anzeigen (6)
idintegerPrimärschlüssel des Steuersatzes. Interne ID.
namestringPflichtName des Steuersatzes, zum Beispiel 19 Prozent.
valuenumber (float)Steuersatz in Prozent.
deletedbooleanDer Steuersatz wird gelöscht.
global_defaultbooleanStandard-Steuersatz für neue Artikel.
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.
Felder anzeigen (19)
idintegerPrimärschlüssel der Ausgabenkategorie. Interne 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)
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/ledger_account_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
}Aktualisiert einen vorhandenen Sachkonto-Eintrag.
PUT/api/invoice/ledger_account/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataLedgerAccountFelder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Sachkonto ändernLedgerAccount
Felder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
Felder anzeigen (6)
idintegerPrimärschlüssel des Steuersatzes. Interne ID.
namestringPflichtName des Steuersatzes, zum Beispiel 19 Prozent.
valuenumber (float)Steuersatz in Prozent.
deletedbooleanDer Steuersatz wird gelöscht.
global_defaultbooleanStandard-Steuersatz für neue Artikel.
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.
Felder anzeigen (19)
idintegerPrimärschlüssel der Ausgabenkategorie. Interne 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)
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PUT \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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
}Aktualisiert einen vorhandenen Sachkonto-Eintrag.
PATCH/api/invoice/ledger_account/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataLedgerAccountFelder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Sachkonto ändernLedgerAccount
Felder anzeigen (15)
display_namestringidintegerPrimärschlüssel des Hauptbuchkontos. Interne 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_accountsstringKontenrahmen, zu dem das Konto gehört, zum Beispiel SKR03.
account_typestringArt des Kontos, zum Beispiel Aktiv oder Erlös.
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.
Felder anzeigen (6)
idintegerPrimärschlüssel des Steuersatzes. Interne ID.
namestringPflichtName des Steuersatzes, zum Beispiel 19 Prozent.
valuenumber (float)Steuersatz in Prozent.
deletedbooleanDer Steuersatz wird gelöscht.
global_defaultbooleanStandard-Steuersatz für neue Artikel.
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.
Felder anzeigen (19)
idintegerPrimärschlüssel der Ausgabenkategorie. Interne 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)
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PATCH \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://eure-instanz.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
}Liefert eine Liste der Kostenstellen-Einträge.
GET/api/invoice/cost_center
Query-Parameter
idstring | |
deletedboolean | Diese Eigenschaft markiert eine Entität als gelöscht / archiviert | Benötigtes Zugriffsrecht: SCOPE | Standardwert: false |
numberstring | |
namestring | |
spherestring | Steuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung. |
isSystemboolean | |
isActiveboolean | |
createdstring | |
updatedstring | |
searchStringstring | Text, nach dem in der Liste gesucht wird |
orderFieldNamestring | Name des Bestellfelds |
orderFieldSortstring | SortiermodusErlaubt: DESCASC |
pageinteger | Seite der Liste |
pageSizeinteger | Anzahl der Einträge je Seite |
withMaxPageNumberstring | gibt die Anzahl verfügbarer Seiten als Header zurück, wenn dies gesetzt ist |
Antworten
200Kostenstellenarray<CostCenter>
Felder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/cost_center_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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"
}
]Legt einen neuen Kostenstellen-Eintrag an.
POST/api/invoice/cost_center
Request-Body application/json
dataCostCenterFelder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Kostenstelle anlegenCostCenter
Felder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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"
}Liefert einen einzelnen Kostenstellen-Eintrag.
GET/api/invoice/cost_center/{identifier}
Pfad-Parameter
identifierPflichtstring |
Antworten
200KostenstelleCostCenter
Felder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.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"
}Aktualisiert einen vorhandenen Kostenstelleneintrag.
PUT/api/invoice/cost_center/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataCostCenterFelder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Kostenstelle ändernCostCenter
Felder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PUT \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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"
}Aktualisiert einen vorhandenen Kostenstelleneintrag.
PATCH/api/invoice/cost_center/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataCostCenterFelder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Kostenstelle ändernCostCenter
Felder anzeigen (10)
display_namestringidintegerPrimärschlüssel der Kostenstelle. Interne ID.
numberstringNummer der Kostenstelle.
spherestringSteuerliche Sphäre, null bei rein betriebswirtschaftlicher Gliederung.
is_systembooleanDie Kostenstelle wird vom System angelegt und kann nicht gelöscht werden.
is_activebooleanDie Kostenstelle ist aktiv.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PATCH \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://eure-instanz.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"
}Liefert eine Liste der Geschäftsjahr-Einträge.
GET/api/invoice/fiscal_year
Query-Parameter
idstring | |
deletedboolean | Diese Eigenschaft markiert eine Entität als gelöscht / archiviert | Benötigtes Zugriffsrecht: SCOPE | Standardwert: 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. | Erfordert Zugriffs-Tag: SCOPE |
closedAtstring | |
closedBystring | |
createdstring | |
updatedstring | |
searchStringstring | Text, nach dem in der Liste gesucht wird |
orderFieldNamestring | Name des Bestellfelds |
orderFieldSortstring | SortiermodusErlaubt: DESCASC |
pageinteger | Seite der Liste |
pageSizeinteger | Anzahl der Einträge je Seite |
withMaxPageNumberstring | gibt die Anzahl verfügbarer Seiten als Header zurück, wenn dies gesetzt ist |
Antworten
200Geschaeftsjahrearray<FiscalYear>
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
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.
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
linesarray<JournalEntryLine>Zeilen des Eintrags.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
}
]Legt einen neuen Geschäftsjahr-Eintrag an.
POST/api/invoice/fiscal_year
Request-Body application/json
dataFiscalYearFelder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Geschaeftsjahr anlegenFiscalYear
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
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.
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
linesarray<JournalEntryLine>Zeilen des Eintrags.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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
}Liefert einen einzelnen Geschäftsjahr-Eintrag.
GET/api/invoice/fiscal_year/{identifier}
Pfad-Parameter
identifierPflichtstring |
Antworten
200GeschaeftsjahrFiscalYear
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
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.
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
linesarray<JournalEntryLine>Zeilen des Eintrags.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'package:http/http.dart' as http;
final response = await http.get(
Uri.parse('https://eure-instanz.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
}Aktualisiert einen vorhandenen Geschäftsjahr-Eintrag.
PUT/api/invoice/fiscal_year/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataFiscalYearFelder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Geschaeftsjahr ändernFiscalYear
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
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.
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
linesarray<JournalEntryLine>Zeilen des Eintrags.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PUT \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.put(
Uri.parse('https://eure-instanz.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
}Aktualisiert einen vorhandenen Geschäftsjahr-Eintrag.
PATCH/api/invoice/fiscal_year/{identifier}
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
dataFiscalYearFelder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
Antworten
200Geschaeftsjahr ändernFiscalYear
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
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.
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
linesarray<JournalEntryLine>Zeilen des Eintrags.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request PATCH \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit package:http (kein Controller im Package iw_erp_api)
import 'dart:convert';
import 'package:http/http.dart' as http;
final response = await http.patch(
Uri.parse('https://eure-instanz.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 läuft.
Pfad-Parameter
identifierPflichtstring |
Antworten
200Offene Punkte vor dem Abschluss
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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
Schließt die Erfolgskonten über das Ergebnis auf das Eigenkapital ab. Vorläufig lässt sich das Jahr noch einmal öffnen, endgültig nicht.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
chartstringprovisionalboolean
Antworten
200Die erzeugte Abschlussbuchung
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.iw-erp.de';
IwApiState().currentJwtApiToken = '<TOKEN>';
final result = await FiscalYearController.close('42');
if (result.success) {
print(result.data);
}Ein vorläufig abgeschlossenes Jahr wieder öffnen.
POST/api/invoice/fiscal_year/{identifier}/reopen
Pfad-Parameter
identifierPflichtstring |
Antworten
200Das wieder geoeffnete Geschaeftsjahr
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
target_fiscal_yearstringchartstring
Antworten
200Die erzeugte Eröffnungsbuchung
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/fiscal_year_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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-Parameter
idstring | |
deletedboolean | Diese Eigenschaft markiert eine Entität als gelöscht / archiviert | Benötigtes Zugriffsrecht: SCOPE | Standardwert: false |
entryNumberstring | Fortlaufende Buchungsnummer, beim Festschreiben vergeben. Erst dann, weil die GoBD eine lückenlose Nummerierung der festgeschriebenen Buchungen verlangt - eine verworfene Erfassung darf keine Lücke hinterlassen. | Benötigt Zugriffsrecht: SCOPE |
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. | Benötigt Zugriffsrecht: SCOPE |
reversalOfstring | Die Buchung, die durch diese hier storniert wird. | Erfordert Zugriffs-Tag: SCOPE |
postedAtstring | |
postedBystring | |
createdstring | |
updatedstring | |
searchStringstring | Text, nach dem in der Liste gesucht wird |
orderFieldNamestring | Name des Bestellfelds |
orderFieldSortstring | SortiermodusErlaubt: DESCASC |
pageinteger | Seite der Liste |
pageSizeinteger | Anzahl der Einträge je Seite |
withMaxPageNumberstring | gibt die Anzahl verfügbarer Seiten als Header zurück, wenn dies gesetzt ist |
Antworten
200Buchungssätzearray<JournalEntry>
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
linesarray<JournalEntryLine>Zeilen des Eintrags.
Felder anzeigen (9)
idintegerPrimärschlüssel der Buchungssatzzeile. Interne ID.
ledger_accountLedgerAccountHauptbuch-Konto, auf das gebucht wird.
cost_centerCostCenterKostenstelle der Buchung.
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 werden hier erhöht.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition der Zeile im Buchungssatz.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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>
Antworten
200Buchungssatz anlegenJournalEntry
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
linesarray<JournalEntryLine>Zeilen des Eintrags.
Felder anzeigen (9)
idintegerPrimärschlüssel der Buchungssatzzeile. Interne ID.
ledger_accountLedgerAccountHauptbuch-Konto, auf das gebucht wird.
cost_centerCostCenterKostenstelle der Buchung.
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 werden hier erhöht.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition der Zeile im Buchungssatz.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
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 = 'eure-instanz.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
Pfad-Parameter
identifierPflichtstring |
Antworten
200Gefundene Mängel, leer wenn buchbar
curl --request GET \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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.
Pfad-Parameter
identifierPflichtstring |
Request-Body application/json
reversal_datestring (date)
Antworten
200Die erzeugte StornobuchungJournalEntry
Felder anzeigen (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.
idintegerPrimärschlüssel des Buchungssatzes. Interne ID.
entry_numberstringFortlaufende Buchungsnummer, beim Festschreiben vergeben. 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_yearFiscalYearGeschäftsjahr, zu dem der Eintrag gehört.
Felder anzeigen (12)
idintegerPrimärschlüssel des Geschäftsjahres. Interne ID.
start_datestring (date-time)Startdatum des Geschäftsjahres.
end_datestring (date-time)Enddatum des Geschäftsjahres.
statusstringStatus des Geschäftsjahres, zum Beispiel offen oder geschlossen.
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)Zeitpunkt, zu dem das Geschäftsjahr abgeschlossen wurde.
closed_byUser14Benutzer, der das Geschäftsjahr abgeschlossen hat.
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.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
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 heißt `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 des Eintrags, zum Beispiel Entwurf oder gebucht.
source_typestringQuelle des Eintrags, zum Beispiel Rechnung oder Zahlung.
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)Zeitpunkt, zu dem der Eintrag veröffentlicht wurde.
posted_byUser14Benutzer, der den Eintrag gebucht hat.
Felder anzeigen (10)
idintegerPrimärschlüssel des Benutzers. Interne ID des Anmeldebenutzers.
namestringAnzeigename des Benutzers. Wird in der Oberfläche und in Protokolleinträgen angezeigt.
usernamestringAnmeldename des Benutzers. Muss über alle Benutzer hinweg eindeutig sein.
emailstringE-Mail-Adresse des Benutzers. Wird für Anmeldebenachrichtigungen, Passwort-Zurücksetzen und als Anmeldealias verwendet.
positioningeneralstringFreitext zur Position oder Rolle des Benutzers.
crm_personCRMPerson10CRM-Person, die mit diesem Anmeldebenutzer verknüpft ist. Verbindet das Anmeldekonto mit dem Personendatensatz.
profile_picture_urlstringURL des Profilbilds des Benutzers.
archivedbooleanMarkiert den Benutzer als archiviert. Archivierte Benutzer bleiben zur Historie erhalten und sind nicht aktiv.
require2fabooleanFür diesen Benutzer ist die Zwei-Faktor-Authentifizierung Pflicht.
search_stringstringText, unter dem die Entität gesucht werden kann.
linesarray<JournalEntryLine>Zeilen des Eintrags.
Felder anzeigen (9)
idintegerPrimärschlüssel der Buchungssatzzeile. Interne ID.
ledger_accountLedgerAccountHauptbuch-Konto, auf das gebucht wird.
cost_centerCostCenterKostenstelle der Buchung.
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 werden hier erhöht.
line_descriptionstringBuchungstext der Zeile. Fehlt er, gilt der Text des Buchungssatzes.
positionintegerPosition der Zeile im Buchungssatz.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
deletedbooleanDiese Eigenschaft markiert eine Entität als gelöscht / archiviert
namestringName der Einheit.
createdstring (date-time)Zeitpunkt, zu dem der Datensatz angelegt wurde.
updatedstring (date-time)Zeitpunkt, zu dem der Datensatz zuletzt aktualisiert wurde.
curl --request POST \
--url https://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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://eure-instanz.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 mit dem Package iw_erp_api
import 'package:iw_erp_api/clients/journal_entry_controller.dart';
import 'package:iw_erp_api/logic/iw_api_state.dart';
IwApiState().host = 'eure-instanz.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"
}
}