Entries API
Entries (Buchungen) sind das Herzstück der doppelten Buchführung in Milkee. Jede Buchung erfasst einen Geschäftsvorfall mit Soll- und Haben-Konto. Entries können Einnahmen (income), Ausgaben (expense) oder Umbuchungen (swap) sein.
Entry-Objekt
{
"data": {
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "105",
"type": "income",
"date": "2024-12-15",
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-15T14:22:00.000000Z",
"sum_formatted": "1500.00",
"date_formatted": "15.12.2024",
"file": null,
"tags": [],
"debit_account": null,
"credit_account": null,
"customer": null,
"project": null,
"tax_rate": null,
"group": null,
}
}Attribute
| Feld | Typ | Beschreibung |
|---|---|---|
id | integer | Eindeutige Entry-ID |
company_id | integer | ID der zugehörigen Firma |
debit_account_id | integer | ID des Soll-Kontos |
credit_account_id | integer | ID des Haben-Kontos |
number | integer | Buchungsnummer (automatisch generiert wenn nicht angegeben) |
type | string | Buchungstyp: income, expense, swap (automatisch ermittelt) |
date | date | Buchungsdatum (Format: YYYY-MM-DD) |
description | string|null | Beschreibung der Buchung |
sum | decimal | Buchungsbetrag |
locked | boolean | Ob die Buchung gesperrt ist (Jahr abgeschlossen) |
billable | boolean | Ob als verrechenbar markiert (nur für Ausgaben mit Customer) |
is_imported | boolean | Ob die Buchung importiert wurde |
created_at | datetime | Erstellungsdatum |
updated_at | datetime | Datum der letzten Aktualisierung |
sum_formatted | string | Formatierter Betrag (2 Dezimalstellen) |
date_formatted | string | Formatiertes Datum (dd.mm.yyyy) |
Optionale Verknüpfungen
Diese Felder können via include Parameter geladen werden:
| Feld | Typ | Beschreibung |
|---|---|---|
file | object|null | Angehängte Datei/Beleg |
tags | array | Zugewiesene Tags |
debit_account | object | Vollständiges Soll-Konto-Objekt |
credit_account | object | Vollständiges Haben-Konto-Objekt |
customer | object|null | Verknüpfter Customer |
project | object|null | Verknüpftes Projekt |
tax_rate | object|null | Angewandter Steuersatz |
group | object|null | Entry-Gruppe für zusammengehörige Buchungen |
invoice | object|null | Verknüpfte Rechnung |
Buchungstypen
Der type wird automatisch basierend auf den Kontoarten ermittelt:
| Type | Beschreibung | Typische Kontenkombination |
|---|---|---|
income | Einnahme | Soll: Bank/Kasse, Haben: Ertragskonto |
expense | Ausgabe | Soll: Aufwandkonto, Haben: Bank/Kasse |
swap | Umbuchung | Soll: Aktivkonto, Haben: Aktivkonto (oder Passiv ↔ Passiv) |
Endpoints
Alle Entries auflisten
GET /companies/{company}/entriesRuft eine paginierte Liste aller Entries der Firma ab mit umfangreichen Filter- und Sortiermöglichkeiten.
Parameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
page | integer | 1 | Seitennummer |
per_page | integer | 15 | Anzahl Entries pro Seite |
filter[id] | integer | - | Exakte Entry-ID |
filter[date] | string | - | Datumsbereich: 2024-01-01,2024-12-31 oder 2024-01-01 (ab diesem Datum) |
filter[type] | string | - | Buchungstyp: income, expense, swap |
filter[customer_id] | integer | - | Exakte Customer-ID (oder null für Einträge ohne Customer) |
filter[project_id] | integer | - | Exakte Project-ID (oder null) |
filter[billable] | boolean | - | Nur verrechenbare Einträge |
filter[locked] | boolean | - | Nur gesperrte/nicht gesperrte Einträge |
filter[invoice_id] | integer | - | Einträge einer bestimmten Rechnung (oder null) |
filter[tax_rate_id] | integer | - | Einträge mit bestimmtem Steuersatz (oder none für ohne Steuersatz) |
filter[account_id] | integer | - | Einträge die dieses Konto verwenden (Soll oder Haben) |
filter[tag_id] | integer | - | Einträge mit bestimmtem Tag |
filter[receipt] | string | - | with (mit Beleg) oder without (ohne Beleg) |
filter[invoiced] | boolean | - | true (verrechnet) oder false (nicht verrechnet) |
include | string | - | Zugehörige Daten laden: customer, project, tags, tax_rate, debit_account, credit_account, group (kommagetrennt) |
sort | string | - | Sortierung: date, -date, sum, -sum, etc. |
Response
{
"data": [
{
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "E-2024-342",
"type": "income",
"date": "2024-12-15",
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-15T14:22:00.000000Z",
"sum_formatted": "1500.00",
"date_formatted": "15.12.2024",
"tags": [],
"tax_rate": null,
"debit_account": {
"id": 1020,
"name": "Bank UBS",
"number": 1020
},
"credit_account": {
"id": 3200,
"name": "Dienstleistungserlöse",
"number": 3200
},
"customer": null,
"project": null,
"group": null,
"file": null,
"invoice": null
}
],
"current_count": 15,
"total_count": 342,
"page": 1,
"per_page": 15
}Standard-Sortierung
Wenn keine Sortierung angegeben wird, werden Entries standardmässig nach Datum absteigend (-date), dann Betrag absteigend (-sum), dann Steuersatz-ID absteigend sortiert.
Beispiele
# Alle Entries abrufen
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries"
# Einnahmen im Dezember 2024
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[type]=income&filter[date]=2024-12-01,2024-12-31"
# Verrechenbare Ausgaben für Customer 410
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[customer_id]=410&filter[billable]=true&filter[invoiced]=false"
# Entries mit Customer-Daten
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?include=customer,project"
# Entries ohne Beleg
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[receipt]=without"Neuen Entry erstellen
POST /companies/{company}/entriesErstellt eine neue Buchung. Der Buchungstyp wird automatisch anhand der Konten ermittelt.
Request Body
{
"date": "2024-12-15",
"debit_account_id": 1020,
"credit_account_id": 3200,
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"customer_id": 410,
"project_id": 55,
"tax_rate_id": 3,
"tag_ids": [1, 5, 8]
}Validierung
| Feld | Regeln |
|---|---|
date | required, date |
debit_account_id | required, muss existierendes Konto der Firma sein |
credit_account_id | required, muss existierendes Konto der Firma sein |
description | nullable, string, max:255 |
sum | nullable, numeric, min:0 |
number | nullable, string, max:255 (automatisch generiert wenn nicht angegeben) |
tax_rate_id | nullable, integer, existierender Steuersatz |
customer_id | nullable, integer, existierender Customer |
project_id | nullable, integer, existierendes Project |
billable | nullable, boolean (nur für Ausgaben mit Customer) |
entry_group_id | nullable, integer, existierende Entry-Gruppe |
tag_ids | nullable, array von Tag-IDs |
file | nullable, file, max 6MB |
Besonderheiten
- Buchungstyp: Wird automatisch anhand der Konten-Kategorien ermittelt
- Buchungsnummer: Wird automatisch generiert wenn nicht angegeben (Format: E-YYYY-XXX oder A-YYYY-XXX)
- Revenue Cap: Bei Einnahmen wird geprüft ob das Jahreslimit erreicht ist (abhängig vom Firmen-Plan)
- Gesperrte Jahre: Buchungen in bereits abgeschlossenen Jahren sind nicht möglich
- Tags: Bestehende Tags via
tag_ids, neue Tags vianewTagsJSON-String - Dateien: Beleg kann direkt hochgeladen werden (max 6MB, Speicherplatz-Quota wird geprüft)
Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": {
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "E-2024-342",
"type": "income",
"date": "2024-12-15",
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-15T14:22:00.000000Z",
"sum_formatted": "1500.00",
"date_formatted": "15.12.2024",
"file": null,
"tags": [
{
"id": 1,
"name": "webdesign",
"color": "blue"
}
],
"debit_account": null,
"credit_account": null,
"customer": null,
"project": null,
"tax_rate": null,
"group": null,
"invoice": null
}
}Revenue Cap
Wenn eine Einnahme-Buchung das konfigurierte Umsatzlimit der Firma überschreitet, wird ein Fehler zurückgegeben. Das Limit hängt vom gewählten Plan ab.
Beispiele
# Einfache Einnahme-Buchung
curl -X POST \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"date": "2024-12-15",
"debit_account_id": 1020,
"credit_account_id": 3200,
"description": "Webdesign",
"sum": 1500.00
}' \
"https://app.milkee.ch/api/v2/companies/123/entries"
# Ausgabe mit Customer und Projekt
curl -X POST \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"date": "2024-12-10",
"debit_account_id": 6300,
"credit_account_id": 1020,
"description": "Büromaterial",
"sum": 250.50,
"customer_id": 410,
"project_id": 55,
"billable": true,
"tag_ids": [2, 5]
}' \
"https://app.milkee.ch/api/v2/companies/123/entries"
# Buchung mit Datei-Upload (multipart)
curl -X POST \
-H "Authorization: Bearer 1|abcdef123456789..." \
-F "date=2024-12-15" \
-F "debit_account_id=1020" \
-F "credit_account_id=3200" \
-F "description=Webdesign" \
-F "sum=1500" \
-F "file=@beleg.pdf" \
"https://app.milkee.ch/api/v2/companies/123/entries"Entries gruppiert auflisten
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
page | integer | 1 | Seitennummer |
per_page | integer | 15 | Anzahl Entries pro Seite |
filter[id] | integer | - | Exakte Entry-ID |
filter[date] | string | - | Datumsbereich: 2024-01-01,2024-12-31 oder 2024-01-01 (ab diesem Datum) |
filter[type] | string | - | Buchungstyp: income, expense, swap |
filter[customer_id] | integer | - | Exakte Customer-ID (oder null für Einträge ohne Customer) |
filter[project_id] | integer | - | Exakte Project-ID (oder null) |
filter[billable] | boolean | - | Nur verrechenbare Einträge |
filter[locked] | boolean | - | Nur gesperrte/nicht gesperrte Einträge |
filter[invoice_id] | integer | - | Einträge einer bestimmten Rechnung (oder null) |
filter[tax_rate_id] | integer | - | Einträge mit bestimmtem Steuersatz (oder none für ohne Steuersatz) |
filter[account_id] | integer | - | Einträge die dieses Konto verwenden (Soll oder Haben) |
filter[tag_id] | integer | - | Einträge mit bestimmtem Tag |
filter[receipt] | string | - | with (mit Beleg) oder without (ohne Beleg) |
filter[invoiced] | boolean | - | true (verrechnet) oder false (nicht verrechnet) |
include | string | - | Zugehörige Daten laden: customer, project, tags, tax_rate, debit_account, credit_account, group (kommagetrennt) |
sort | string | - | Sortierung: date, -date, sum, -sum, etc. |
Response
{
"data": [
{
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "E-2024-342",
"type": "income",
"date": "2024-12-15",
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-15T14:22:00.000000Z",
"sumFormatted": "1,500.00",
"dateFormatted": "15.12.2024",
"tags": [],
"tax_rate": null,
"debit_account": {
"id": 1020,
"name": "Bank UBS",
"number": 1020
},
"credit_account": {
"id": 3200,
"name": "Dienstleistungserlöse",
"number": 3200
},
"customer": null,
"project": null,
"group": null
}
],
"current_count": 15,
"total_count": 342,
"page": 1,
"per_page": 15
}Standard-Sortierung
Wenn keine Sortierung angegeben wird, werden Entries standardmässig nach Datum absteigend (-date), dann Betrag absteigend (-sum), dann Steuersatz-ID absteigend sortiert.
Beispiele
# Alle Entries abrufen
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries"
# Einnahmen im Dezember 2024
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[type]=income&filter[date]=2024-12-01,2024-12-31"
# Verrechenbare Ausgaben für Customer 410
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[customer_id]=410&filter[billable]=true&filter[invoiced]=false"
# Entries mit Customer-Daten
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?include=customer,project"
# Entries ohne Beleg
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries?filter[receipt]=without"Entries gruppiert auflisten
GET /companies/{company}/entries-groupedRuft Entries ab und gruppiert zusammengehörige Buchungen (via entry_group_id). Jede Gruppe wird als ein Pseudo-Entry dargestellt.
Parameter
Gleiche Parameter wie beim normalen index Endpoint.
Response
{
"data": [
{
"id": 15,
"entry_group_id": 15,
"description": "Sammelbu chung Reisekosten",
"type": "expense",
"sum": 850.50,
"date": "2024-12-10",
"debit_account": {
"id": 6400,
"name": "Reisekosten"
},
"credit_account": {
"id": 1020,
"name": "Bank UBS"
},
"number": "A-2024-155",
"file_id": null,
"customer_id": null,
"project_id": null,
"formatted": {
"date": "10.12.2024"
},
"sumFormatted": "850.50",
"grouped_entries": [
{
"id": 5430,
"description": "Zugfahrt",
"sum": 125.00,
"date": "2024-12-10"
},
{
"id": 5431,
"description": "Hotel",
"sum": 525.50,
"date": "2024-12-10"
},
{
"id": 5432,
"description": "Verpflegung",
"sum": 200.00,
"date": "2024-12-10"
}
],
"locked": false,
"search_string": "Zugfahrt;125;Hotel;525.5;Verpflegung;200;"
}
],
"current_count": 1,
"total_count": 85,
"page": 1,
"per_page": 15
}Gruppierte Entries
- Wenn alle Entries in einer Gruppe den gleichen Typ haben, wird die Summe aggregiert
- Bei gemischten Typen wird
sum: falsezurückgegeben - Konten werden als "Mehrere" angezeigt wenn nicht alle Entries die gleichen Konten haben
grouped_entriesenthält alle einzelnen Buchungen der Gruppe
Beispiel
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries-grouped?filter[date]=2024-12-01,2024-12-31"Einzelnen Entry abrufen
GET /companies/{company}/entries/{entry}Ruft die Details eines spezifischen Entries ab.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
company | integer | Firmen-ID |
entry | integer | Entry-ID |
include | string | Zugehörige Daten laden: file, tags, debitAccount, creditAccount, customer, project, taxRate, group, invoice |
Response
{
"data": {
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "E-2024-342",
"type": "income",
"date": "2024-12-15",
"description": "Webdesign für Kunde Muster AG",
"sum": 1500.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-15T14:22:00.000000Z",
"sumFormatted": "1,500.00",
"dateFormatted": "15.12.2024",
"file": {
"id": 234,
"name": "beleg.pdf",
"url": "https://..."
},
"tags": [
{
"id": 1,
"name": "webdesign",
"color": "blue"
}
],
"debit_account": {
"id": 1020,
"name": "Bank UBS",
"number": 1020,
"account_category": {
"id": 5,
"name": "Umlaufvermögen",
"type": "assets"
}
},
"credit_account": {
"id": 3200,
"name": "Dienstleistungserlöse",
"number": 3200,
"account_category": {
"id": 12,
"name": "Betriebsertrag",
"type": "income"
}
},
"customer": {
"id": 410,
"name": "Muster AG",
"number": 1001
},
"project": null,
"tax_rate": {
"id": 3,
"name": "MWST 8.1%",
"rate": 8.1
},
"group": null,
"invoice": null
}
}Beispiel
# Entry mit allen Relationen abrufen
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries/5432?include=file,tags,debitAccount.accountCategory,creditAccount.accountCategory,customer,project,taxRate"Entry aktualisieren
PUT /companies/{company}/entries/{entry}Aktualisiert einen bestehenden Entry.
Request Body
{
"date": "2024-12-16",
"description": "Webdesign für Kunde Muster AG (aktualisiert)",
"sum": 1650.00,
"debit_account_id": 1020,
"credit_account_id": 3200,
"tax_rate_id": 3,
"customer_id": 410,
"project_id": 55,
"tag_ids": [1, 5, 8]
}Validierung
Siehe Neuen Entry erstellen - alle Felder sind sometimes (optional).
Besonderheiten
- Gesperrte Einträge: Entries in abgeschlossenen Jahren können nicht bearbeitet werden
- Abschreibungs-Entries: Nur Datei kann aktualisiert werden, keine anderen Felder
- Buchungstyp: Wird nach Änderung der Konten automatisch neu berechnet
- Tags:
tag_idsersetzt alle Tags,newTagsfügt neue Tags hinzu - Datei: Neue Datei ersetzt alte Datei (alte wird gelöscht)
Response
{
"data": {
"id": 5432,
"company_id": 123,
"debit_account_id": 1020,
"credit_account_id": 3200,
"number": "E-2024-342",
"type": "income",
"date": "2024-12-16",
"description": "Webdesign für Kunde Muster AG (aktualisiert)",
"sum": 1650.00,
"locked": false,
"billable": false,
"is_imported": false,
"created_at": "2024-12-15T14:22:00.000000Z",
"updated_at": "2024-12-16T09:30:00.000000Z",
"sumFormatted": "1,650.00",
"dateFormatted": "16.12.2024",
"tags": [...],
"file": null,
"customer": {...},
"project": {...},
"tax_rate": {...},
"group": null
}
}Beispiel
curl -X PUT \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"description": "Webdesign aktualisiert",
"sum": 1650.00,
"tag_ids": [1, 5, 8]
}' \
"https://app.milkee.ch/api/v2/companies/123/entries/5432"Entry löschen
DELETE /companies/{company}/entries/{entry}Löscht einen bestehenden Entry unwiderruflich.
Löschbedingungen
Ein Entry kann nur gelöscht werden wenn:
- Das Jahr nicht abgeschlossen ist (
locked= false)
Beim Löschen wird automatisch:
- Der Entry aus allen Tags entfernt
- Die angehängte Datei gelöscht
- Die Entry-Gruppe gelöscht wenn sie danach leer ist
Response
HTTP/1.1 204 No ContentBeispiel
curl -X DELETE \
-H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries/5432"Nächste Buchungsnummer abrufen
GET /companies/{company}/entries/number/{type}Ruft die nächste verfügbare Buchungsnummer für einen bestimmten Typ ab.
Parameter
| Parameter | Typ | Beschreibung |
|---|---|---|
type | string | income, expense oder swap |
year | integer | Jahr (Standard: aktuelles Jahr) |
number | integer | Prüfen ob diese spezifische Nummer frei ist. Falls nicht, wird die nächste freie Nummer ausgegeben. |
Response
{
"number": 342
}Beispiele
# Nächste Einnahmen-Nummer für 2024
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries/number/income?year=2024"
# Prüfen ob Nummer 500 für Ausgaben frei ist
curl -H "Authorization: Bearer 1|abcdef123456789..." \
"https://app.milkee.ch/api/v2/companies/123/entries/number/expense?number=500&year=2024"Mehrere Entries löschen
DELETE /companies/{company}/entries/multipleLöscht mehrere Entries gleichzeitig.
Request Body
{
"ids": [5432, 5433, 5434]
}Response
HTTP/1.1 204 No ContentBeispiel
curl -X DELETE \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{"ids": [5432, 5433, 5434]}' \
"https://app.milkee.ch/api/v2/companies/123/entries/multiple"Mehrere Entries aktualisieren
PUT /companies/{company}/entries/multipleAktualisiert mehrere Entries gleichzeitig. Nützlich für Bulk-Operationen wie Zuweisen von Tags, Customer, Datum etc.
Request Body
{
"ids": [5432, 5433, 5434],
"customer_id": 410,
"billable": true,
"tag_ids": [1, 5],
"overrideTags": false
}Mögliche Bulk-Updates
| Feld | Beschreibung |
|---|---|
customer_id | Customer zuweisen/ändern |
project_id | Projekt zuweisen/ändern (inkl. Customer) |
date | Datum für alle ändern (Jahr muss offen sein) |
tag_ids | Tags hinzufügen (oder ersetzen wenn overrideTags: true) |
newTags | Neue Tags erstellen und zuweisen |
account_id + account_type | Konto auf bestimmter Seite ändern |
tax_rate_id | Steuersatz ändern |
billable | Verrechenbar-Flag setzen |
Besonderheiten
- Abschreibungs-Entries: Werden automatisch übersprungen
- Tags: Mit
overrideTags: truewerden bestehende Tags erst entfernt, dann neue gesetzt - Konten: Mit
account_type: "bank"wird das Konto auf der richtigen Seite gesetzt (abhängig vom Entry-Typ) - Gesperrte Jahre: Datumsänderung prüft ob Ziel-Jahr offen ist
Response
HTTP/1.1 204 No ContentBeispiele
# Customer und Projekt für mehrere Entries setzen
curl -X PUT \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"ids": [5432, 5433, 5434],
"project_id": 55,
"billable": true
}' \
"https://app.milkee.ch/api/v2/companies/123/entries/multiple"
# Tags für mehrere Entries ersetzen
curl -X PUT \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"ids": [5432, 5433],
"tag_ids": [1, 5, 8],
"overrideTags": true
}' \
"https://app.milkee.ch/api/v2/companies/123/entries/multiple"
# Bankkonto für mehrere Ausgaben ändern
curl -X PUT \
-H "Authorization: Bearer 1|abcdef123456789..." \
-H "Content-Type: application/json" \
-d '{
"ids": [5432, 5433],
"account_id": 1021,
"account_type": "bank"
}' \
"https://app.milkee.ch/api/v2/companies/123/entries/multiple"Fehlerbehandlung
Häufige Fehler
400 Bad Request - Revenue Cap erreicht
{
"message": "Mit dieser Buchung würdest du das Umsatzlimit von CHF 500,000.00 überschreiten. Bitte upgraden Sie Ihren Plan."
}Ursache: Die Einnahme-Buchung würde das konfigurierte Jahreslimit überschreiten.
422 Validation Error - Gesperrtes Jahr
{
"message": "Dieses Jahr ist bereits abgeschlossen."
}Ursache: Versuch eine Buchung in einem abgeschlossenen Jahr zu erstellen oder zu ändern.
422 Validation Error - Datei zu gross
{
"message": "Datei darf nicht grösser als 6MB sein."
}Ursache: Hochgeladene Datei überschreitet die 6MB-Grenze.
422 Validation Error - Speicherplatz
{
"message": "Speicherplatz voll. Bitte löschen Sie Dateien oder upgraden Sie Ihren Plan."
}Ursache: Firmen-Speicherquota ist erschöpft.
422 Validation Error - Allgemein
{
"message": "The given data was invalid.",
"errors": {
"date": [
"Das Datum muss ein gültiges Datum sein."
],
"debit_account_id": [
"Das Soll-Konto existiert nicht."
],
"sum": [
"Der Betrag muss mindestens 0 sein."
]
}
}Best Practices
Buchungsnummern
Nutzen Sie den /entries/{type}/count Endpoint, um die nächste verfügbare Buchungsnummer abzurufen. Dies stellt sicher, dass keine Duplikate entstehen. Buchungsnummern folgen dem Format E-YYYY-XXX für Einnahmen und A-YYYY-XXX für Ausgaben.
Verrechenbare Ausgaben tracken
Filtern Sie Entries mit filter[type]=expense, filter[customer_id]={id}, filter[billable]=true und filter[invoiced]=false, um alle verrechenbaren Ausgaben zu finden, die noch nicht in Rechnung gestellt wurden. Berechnen Sie die Gesamtsumme für eine Übersicht.
Bulk-Tagging
Verwenden Sie den /entries/multiple Endpoint mit PUT-Methode, um mehrere Entries gleichzeitig mit Tags zu versehen. Mit overrideTags: true können Sie bestehende Tags ersetzen, ohne diesen Parameter werden Tags hinzugefügt.
Sichere Buchungs-Erstellung
Behandeln Sie spezifische Fehler bei der Entry-Erstellung:
- Revenue Cap: Umsatzlimit erreicht - Plan-Upgrade erforderlich
- Gesperrtes Jahr: Jahr ist abgeschlossen - keine Buchungen mehr möglich
- Speicherplatz voll: Quota erschöpft - Dateien löschen oder Plan upgraden
Periodenabfragen
Nutzen Sie den filter[date] Parameter mit einem Datumsbereich (YYYY-MM-DD,YYYY-MM-DD) für Periodenabfragen. Für monatliche oder jährliche Reports kombinieren Sie dies mit filter[type] für Einnahmen oder Ausgaben.
Nächste Schritte
- Accounts API - Konten für Buchungen verwalten
- Customers API - Customers mit Buchungen verknüpfen
- Tags API - Tags für Buchungen erstellen
- Code-Beispiele ansehen
- Webhooks einrichten
