API-Dokumentation
Mit der Rechnio REST-API kannst du Kunden, Rechnungen, Transaktionen und Belege programmatisch abrufen und verwalten. Die API ist RESTful und liefert JSON-Antworten.
Übersicht
https://rechnio.at/api/v1application/jsonAuthentifizierung
Die Rechnio-API verwendet API-Schlüssel zur Authentifizierung. Füge deinen API-Schlüssel als Bearer-Token im Authorization-Header jeder Anfrage hinzu.
Authorization: Bearer rechnio_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxAPI-Schlüssel erstellen
- 1. Melde dich in deinem Rechnio-Dashboard an.
- 2. Navigiere zu Einstellungen → API-Keys.
- 3. Klicke auf „Neuen API-Key generieren".
- 4. Kopiere den angezeigten Schlüssel — er wird nur einmal angezeigt.
Schlüsselformat
Alle API-Schlüssel beginnen mit dem Präfix rechnio_live_ gefolgt von 48 zufälligen hexadezimalen Zeichen. Schlüssel werden nur als SHA-256-Hash in der Datenbank gespeichert.
Endpunkte
/api/v1/customersKundenliste abrufen
/api/v1/customersNeuen Kunden anlegen
/api/v1/invoicesRechnungsliste abrufen
/api/v1/invoicesNeue Rechnung erstellen
/api/v1/transactionsTransaktionen abrufen
/api/v1/receiptsBelege abrufen
Kunden
GET /api/v1/customers
Gibt eine paginierte Liste aller Kunden zurück.
Query-Parameter
limit | number | Anzahl der Ergebnisse (Standard: 100, Max: 500) |
offset | number | Offset für Paginierung (Standard: 0) |
search | string | Suche nach Firmenname, Vor-/Nachname oder E-Mail |
curl -X GET "https://rechnio.at/api/v1/customers?limit=10&search=Muster" \
-H "Authorization: Bearer rechnio_live_xxx"{
"total": 42,
"limit": 10,
"offset": 0,
"items": [
{
"id": "clx...",
"customerNumber": "K-00001",
"company": "Musterfirma GmbH",
"firstName": null,
"lastName": null,
"email": "office@musterfirma.at",
"phone": "+43 512 123456",
"addressLine1": "Musterstraße 1",
"city": "Innsbruck",
"postalCode": "6020",
"country": "AT",
"vatId": "ATU12345678",
"notes": null,
"createdAt": "2025-01-15T10:30:00.000Z"
}
]
}POST /api/v1/customers
Legt einen neuen Kunden an. Entweder company oder firstName/lastName ist erforderlich.
Request Body
company | string | Firmenname (für Geschäftskunden) |
firstName | string | Vorname (für Privatpersonen) |
lastName | string | Nachname (für Privatpersonen) |
email | string | E-Mail-Adresse |
phone | string | Telefonnummer |
addressLine1 | string | Straße und Hausnummer |
city | string | Stadt |
postalCode | string | Postleitzahl |
country | string | Ländercode (z.B. AT, DE, CH) |
vatId | string | UID-Nummer (z.B. ATU12345678) |
notes | string | Interne Notizen |
curl -X POST "https://rechnio.at/api/v1/customers" \
-H "Authorization: Bearer rechnio_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"company": "Neue Firma GmbH",
"email": "office@neuefirma.at",
"country": "AT",
"vatId": "ATU87654321"
}'Antwort: 201 Created — das angelegte Kundenobjekt. Löst Webhook-Event customer.created aus.
Rechnungen
GET /api/v1/invoices
Gibt eine paginierte Liste aller Rechnungen zurück, sortiert nach Rechnungsdatum (neueste zuerst).
Query-Parameter
limit | number | Anzahl der Ergebnisse (Standard: 100, Max: 500) |
offset | number | Offset für Paginierung (Standard: 0) |
status | string | Filter: draft | sent | paid | cancelled |
curl "https://rechnio.at/api/v1/invoices?status=paid&limit=20" \
-H "Authorization: Bearer rechnio_live_xxx"{
"total": 138,
"limit": 20,
"offset": 0,
"items": [
{
"id": "clx...",
"invoiceNumber": "R-2025-0042",
"status": "paid",
"invoiceDate": "2025-03-01T00:00:00.000Z",
"dueDate": "2025-03-15T00:00:00.000Z",
"subtotal": 1000,
"vatRate": 20,
"vatAmount": 200,
"total": 1200,
"currency": "EUR",
"customer": {
"id": "clx...",
"company": "Musterfirma GmbH",
"email": "office@musterfirma.at"
},
"items": [
{
"position": 1,
"description": "Webentwicklung",
"quantity": 10,
"unit": "Std.",
"unitPrice": 100,
"totalPrice": 1000
}
]
}
]
}POST /api/v1/invoices
Erstellt eine neue Rechnung im Status draft. Die Rechnungsnummer wird automatisch aus der angegebenen Serie generiert.
Request Body
seriesId* | string | ID der Rechnungsserie (aus Einstellungen → Serien) |
items* | array | Mindestens eine Position (siehe unten) |
invoiceDate* | string | Rechnungsdatum (ISO 8601: YYYY-MM-DD) |
customerId | string | Kunden-ID (optional) |
dueDate | string | Fälligkeitsdatum (ISO 8601). Standard: invoiceDate + Zahlungsziel der Serie |
vatRate | number | MwSt.-Satz in % (z.B. 20, 13, 10, 0). Standard: Serienwert |
reverseCharge | boolean | Steuerschuldübergang (setzt vatRate auf 0) |
sepaDirectDebit | boolean | SEPA-Lastschrift: ersetzt Überweisungstext durch Abbuchungshinweis |
servicePeriodStart | string | Leistungszeitraum Beginn (ISO 8601) |
servicePeriodEnd | string | Leistungszeitraum Ende (ISO 8601) |
notes | string | Freitext-Notiz auf der Rechnung |
items – Felder pro Position
description* | string | Beschreibung der Leistung |
quantity* | number | Menge |
unitPrice* | number | Einzelpreis (netto) |
unit | string | Einheit (z.B. Stk., Std., Pauschal). Standard: Stk. |
curl -X POST "https://rechnio.at/api/v1/invoices" \
-H "Authorization: Bearer rechnio_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"seriesId": "clx...",
"customerId": "clx...",
"invoiceDate": "2025-06-01",
"vatRate": 20,
"items": [
{
"description": "Webentwicklung Juni 2025",
"quantity": 20,
"unit": "Std.",
"unitPrice": 95
}
],
"notes": "Zahlbar innerhalb 14 Tagen."
}'Antwort: 201 Created — das erstellte Rechnungsobjekt inkl. generierter Rechnungsnummer. Löst Webhook-Event invoice.created aus.
"sepaDirectDebit": true erscheint auf der Rechnung statt des Überweisungstexts: „Nicht überweisen – Diese Rechnung wird wie vereinbart von Ihrem Konto abgebucht."Transaktionen
GET /api/v1/transactions
Gibt Banktransaktionen zurück, optional gefiltert nach Datumsbereich, Kategorie oder Konto.
Query-Parameter
limit | number | Anzahl der Ergebnisse (Standard: 100, Max: 500) |
offset | number | Offset für Paginierung (Standard: 0) |
from | string | Startdatum (YYYY-MM-DD), inklusiv |
to | string | Enddatum (YYYY-MM-DD), inklusiv |
category | string | Kategorie-Filter (exakte Übereinstimmung) |
accountId | string | Konto-ID-Filter |
curl "https://rechnio.at/api/v1/transactions?from=2025-01-01&to=2025-03-31" \
-H "Authorization: Bearer rechnio_live_xxx"{
"total": 95,
"limit": 100,
"offset": 0,
"items": [
{
"id": "clx...",
"amount": "1200.00",
"description": "Zahlung Musterfirma GmbH",
"category": "Einnahmen",
"accountId": "clx...",
"bookingDate": "2025-03-05T00:00:00.000Z",
"valueDate": "2025-03-05T00:00:00.000Z",
"account": {
"id": "clx...",
"name": "Geschäftskonto"
}
}
]
}Belege
GET /api/v1/receipts
Gibt hochgeladene Belege zurück, die per KI (OCR) verarbeitet wurden.
Query-Parameter
limit | number | Anzahl der Ergebnisse (Standard: 100, Max: 500) |
offset | number | Offset für Paginierung (Standard: 0) |
status | string | assigned (zugeordnet) | unassigned (nicht zugeordnet) |
curl "https://rechnio.at/api/v1/receipts?status=unassigned" \
-H "Authorization: Bearer rechnio_live_xxx"{
"total": 12,
"limit": 100,
"offset": 0,
"items": [
{
"id": "clx...",
"originalName": "rechnung-amazon.pdf",
"fileSize": 48392,
"mimeType": "application/pdf",
"fileUrl": "/uploads/receipts/xxx.pdf",
"ocrDate": "2025-02-14T00:00:00.000Z",
"ocrAmount": "29.90",
"ocrCurrency": "EUR",
"ocrCounterparty": "Amazon EU S.à r.l.",
"ocrDescription": "AWS Services Februar 2025",
"ocrDocumentType": "Rechnung",
"transactionId": null,
"createdAt": "2025-02-15T09:12:43.000Z"
}
]
}Webhooks
Mit Webhooks kannst du in Echtzeit über Ereignisse in deinem Rechnio-Konto informiert werden. Rechnio sendet einen HTTP-POST-Request mit einem JSON-Body an deine konfigurierte URL.
Webhook einrichten
- 1. Gehe zu Einstellungen → Webhooks im Dashboard.
- 2. Trage deine Empfänger-URL ein (muss HTTPS sein).
- 3. Wähle die Ereignisse, die du empfangen möchtest.
- 4. Kopiere das generierte Webhook-Secret für die Signaturprüfung.
Verfügbare Ereignisse
customer.created | event | Ein neuer Kunde wurde angelegt |
invoice.created | event | Eine neue Rechnung wurde erstellt |
invoice.sent | event | Eine Rechnung wurde per E-Mail versendet |
invoice.deleted | event | Eine Rechnung wurde gelöscht |
transaction.imported | event | Transaktionen wurden importiert |
receipt.uploaded | event | Ein Beleg wurde hochgeladen und verarbeitet |
* | event | Wildcard: alle Ereignisse empfangen |
Signaturprüfung (HMAC-SHA256)
Rechnio signiert jeden Webhook-Request mit dem Webhook-Secret. Überprüfe die Signatur, um sicherzustellen, dass der Request von Rechnio stammt.
Header
X-Rechnio-Signature: sha256=<hmac-sha256-hex>Verifikation (Node.js)
import crypto from 'crypto'
function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
)
}
// In deinem Webhook-Handler:
const rawBody = await req.text()
const sig = req.headers.get('x-rechnio-signature') ?? ''
if (!verifyWebhook(rawBody, sig, process.env.WEBHOOK_SECRET!)) {
return new Response('Unauthorized', { status: 401 })
}Payload-Format
{
"event": "invoice.created",
"tenantId": "clx...",
"data": {
"id": "clx...",
"invoiceNumber": "R-2025-0043",
"status": "draft",
...
}
}Fehlerbehandlung
Die API verwendet Standard-HTTP-Statuscodes. Fehlerantworten enthalten ein error-Feld mit einer deutschen Fehlermeldung.
200 OK | Erfolg | Anfrage erfolgreich |
201 Created | Erfolg | Ressource erfolgreich erstellt |
400 Bad Request | Fehler | Ungültige Parameter oder fehlende Pflichtfelder |
401 Unauthorized | Fehler | Fehlender oder ungültiger API-Schlüssel |
404 Not Found | Fehler | Ressource nicht gefunden |
405 Method Not Allowed | Fehler | HTTP-Methode nicht erlaubt |
500 Internal Server Error | Fehler | Serverfehler – bitte Support kontaktieren |
{
"error": "Ungültiger API-Schlüssel."
}Code-Beispiele
JavaScript / TypeScript (fetch)
const API_KEY = process.env.RECHNIO_API_KEY // rechnio_live_xxx
const BASE_URL = 'https://rechnio.at/api/v1'
const headers = {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json',
}
// Kunden abrufen
const res = await fetch(`${BASE_URL}/customers?limit=50`, { headers })
const { items, total } = await res.json()
console.log(`${total} Kunden gefunden`)
// Neuen Kunden anlegen
const newCustomer = await fetch(`${BASE_URL}/customers`, {
method: 'POST',
headers,
body: JSON.stringify({
company: 'Neue GmbH',
email: 'info@neue-gmbh.at',
country: 'AT',
}),
}).then(r => r.json())
// Bezahlte Rechnungen der letzten 30 Tage
const since = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
const invoices = await fetch(
`${BASE_URL}/invoices?status=paid&limit=100`,
{ headers }
).then(r => r.json())Python (requests)
import requests, os
API_KEY = os.environ['RECHNIO_API_KEY']
BASE_URL = 'https://rechnio.at/api/v1'
headers = {'Authorization': f'Bearer {API_KEY}'}
# Kunden abrufen
r = requests.get(f'{BASE_URL}/customers', headers=headers, params={'limit': 50})
data = r.json()
print(f"{data['total']} Kunden")
# Neuen Kunden anlegen
r = requests.post(f'{BASE_URL}/customers', headers=headers, json={
'company': 'Neue GmbH',
'email': 'info@neue-gmbh.at',
'country': 'AT',
})
print(r.json()['customerNumber']) # z.B. K-00015cURL
# Kundenliste abrufen
curl "https://rechnio.at/api/v1/customers?limit=10" \
-H "Authorization: Bearer rechnio_live_xxx"
# Neuen Kunden anlegen
curl -X POST "https://rechnio.at/api/v1/customers" \
-H "Authorization: Bearer rechnio_live_xxx" \
-H "Content-Type: application/json" \
-d '{"company":"Test GmbH","email":"test@example.at","country":"AT"}'
# Rechnungen nach Status filtern
curl "https://rechnio.at/api/v1/invoices?status=paid&limit=5" \
-H "Authorization: Bearer rechnio_live_xxx"
# Transaktionen nach Datumsbereich
curl "https://rechnio.at/api/v1/transactions?from=2025-01-01&to=2025-12-31" \
-H "Authorization: Bearer rechnio_live_xxx"Fragen zur API?
Bei Problemen oder Fragen steht dir unser Support-Team zur Verfügung.
support@rechnio.at