Rechnungen abrufen
Gibt eine paginierte Liste aller Rechnungen des Unternehmens zurück. Die Liste enthält Rechnungsköpfe ohne Positionen – für die vollständigen Positionen verwendest du den Details-Endpoint.
Request
GET /api/oauth/v2/resource/invoices
Header
| Header | Wert |
|---|---|
Authorization | Bearer {access_token} |
Query-Parameter
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
offset | integer | Nein | Startposition (Standard: 0, Min: 0) |
limit | integer | Nein | Anzahl Ergebnisse (Standard: 50, Min: 1, Max: 200) |
view | string | Nein | Antwortformat: default (Vorgabe) oder slim (schlanker Abruf) |
createdSince | string (ISO 8601) | Nein | Nur Rechnungen, die ab diesem Zeitpunkt angelegt wurden (createdAt >=) |
createdUntil | string (ISO 8601) | Nein | Nur Rechnungen, die bis zu diesem Zeitpunkt angelegt wurden (createdAt <=) |
updatedSince | string (ISO 8601) | Nein | Nur Rechnungen, die ab diesem Zeitpunkt geändert wurden (updatedAt >=). Neu angelegte Rechnungen kommen mit, weil der Änderungszeitpunkt beim Anlegen gesetzt wird. |
updatedUntil | string (ISO 8601) | Nein | Nur Rechnungen, die bis zu diesem Zeitpunkt geändert wurden (updatedAt <=) |
Hinweis: Für einen Abgleich genügt
updatedSince– der Wert deckt neue und geänderte Rechnungen ab.
Hinweis: Formate, Zeitzonen-Verhalten, Sortierung im Filter-Modus, Cursor-Strategie und die
meta.total-Falle gelten für alle Zeitstempel-Filter gleich – siehe Inkrementeller Abgleich. Das Restrisiko der Paginierung tritt bei Rechnungen zusätzlich auf, wenn eine Rechnung während des Durchlaufs gelöscht wird.
Hinweis zu Löschungen: Rechnungen führen keinen Löschzeitpunkt. Deshalb gibt es hier kein
deletedSince. Eine gelöschte Rechnung verschwindet aus dieser Liste und aus dem Einzelabruf, ohne dass der Abgleich davon erfährt.Eine Rechnung, die dein Client zwischengespeichert hat, bleibt dort dauerhaft bestehen. Wer Löschungen erkennen muss, braucht zusätzlich einen periodischen Vollabgleich: alle Rechnungen ohne Zeitstempel-Filter holen und mit dem eigenen Bestand vergleichen.
Response
Erfolg (200 OK)
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"sequence": 42,
"formattedSequence": "RE-2026-0042",
"name": "Rechnung an Anna Muster",
"status": "open",
"net": 100.00,
"subTotal": 110.00,
"gross": 110.00,
"discount": 0.00,
"outstandingBalance": 110.00,
"invoicingDate": "2026-06-01",
"paidAt": null,
"timeForPayment": "2026-06-15",
"isFullyPaid": false,
"visible": true,
"comment": null,
"customer": {
"id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210",
"firstName": "Anna",
"lastName": "Muster"
},
"createdAt": "2026-06-01T09:30:00+02:00",
"updatedAt": "2026-06-05T14:10:00+02:00"
}
],
"meta": {
"total": 128,
"offset": 0,
"limit": 50
}
}Response-Felder
| Feld | Typ | Beschreibung |
|---|---|---|
data | Array | Liste der Rechnungen |
data[].id | string (UUID) | Eindeutige ID der Rechnung |
data[].sequence | integer | null | Laufende Nummer der Rechnung |
data[].formattedSequence | string | null | Formatierte Rechnungsnummer |
data[].name | string | null | Bezeichnung der Rechnung |
data[].status | string | null | Status der Rechnung |
data[].net | number | null | Nettobetrag |
data[].subTotal | number | null | Zwischensumme |
data[].gross | number | null | Bruttobetrag |
data[].discount | number | null | Rabattbetrag |
data[].outstandingBalance | number | null | Offener Betrag |
data[].invoicingDate | string | null | Rechnungsdatum (YYYY-MM-DD) |
data[].paidAt | string | null | Zahlungsdatum (YYYY-MM-DD) |
data[].timeForPayment | string | null | Zahlungsfrist (YYYY-MM-DD) |
data[].isFullyPaid | boolean | Vollständig bezahlt |
data[].visible | boolean | Rechnung sichtbar |
data[].comment | string | null | Kommentar zur Rechnung |
data[].customer | object | null | Zugeordnete:r Kunde/Kundin |
data[].customer.id | string (UUID) | Kunden-ID |
data[].customer.firstName | string | Vorname |
data[].customer.lastName | string | Nachname |
data[].createdAt | string (ISO 8601) | null | Erstellungszeitpunkt |
data[].updatedAt | string (ISO 8601) | null | Letzter Änderungszeitpunkt |
meta.total | integer | Gesamtanzahl der Rechnungen |
meta.offset | integer | Aktuelle Startposition |
meta.limit | integer | Anzahl der zurückgegebenen Einträge |
Schlanker Abruf (?view=slim)
Mit view=slim liefert der Endpoint eine schlanke Payload mit weniger Daten pro Rechnung. Ohne den Parameter bleibt der Abruf unverändert.
Wird view mehrfach angegeben, gilt die letzte Angabe – ?view=default&view=slim liefert also die schlanke Antwort.
Die schlanke Payload enthält:
id, sequence, formattedSequence, status, net, subTotal, gross, discount, outstandingBalance, invoicingDate, paidAt, isFullyPaid, customer (nur id), createdAt, updatedAt
Referenzen wie customer erscheinen im schlanken Abruf nur als Objekt mit id, ohne die übrigen Felder. name, timeForPayment, visible und comment entfallen.
Hinweis:
createdAtundupdatedAtliefert derzeit nur der schlanke Abruf – der Standardabruf führt diese Felder noch nicht.
Warnung: Verwende
updatedAtbei Rechnungen aktuell nicht als Cursor für einen inkrementellen Abgleich. Der Wert wird derzeit nicht bei jeder Änderung zuverlässig gesetzt, eine Änderung kann dadurch unbemerkt am Cursor vorbeilaufen. Für einen vollständigen Abgleich ist bis auf Weiteres ein periodischer Vollabruf nötig.
Beispiel: view=slim
{
"data": [
{
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"sequence": 42,
"formattedSequence": "RE-2026-0042",
"status": "open",
"net": 100.00,
"subTotal": 110.00,
"gross": 110.00,
"discount": 0.00,
"outstandingBalance": 110.00,
"invoicingDate": "2026-06-01",
"paidAt": null,
"isFullyPaid": false,
"customer": {
"id": "f0e1d2c3-b4a5-6789-fedc-ba9876543210"
},
"createdAt": "2026-05-20T09:12:00+02:00",
"updatedAt": "2026-06-01T14:03:00+02:00"
}
],
"meta": {
"total": 128,
"offset": 0,
"limit": 50
}
}curl -X GET "https://my.offisy.at/api/oauth/v2/resource/invoices?offset=0&limit=50&view=default&createdSince=beispiel&createdUntil=beispiel&updatedSince=2026-04-15T10%3A00%3A00&updatedUntil=2026-04-15T10%3A00%3A00" \
-H "Authorization: Bearer {access_token}"Mögliche Fehler
| Status | Code | Beschreibung |
|---|---|---|
| 400 | validation_error | Ungültiger Wert für view (gültige Werte: default, slim) |
| 400 | validation_error | Ein Zeitstempel-Filter enthält einen ungültigen Wert |
| 401 | invalid_client | Ungültiger oder fehlender Access Token |
| 403 | insufficient_scope | Scope invoices nicht vorhanden |