Schnellstart
1. In BauManager Pro unter Einstellungen → API-Zugang einen Schlüssel anlegen (nur Administratoren). 2. Den Schlüssel bei jeder Anfrage mitsenden. 3. Fertig — alle Daten sind JSON in UTF-8.
curl https://baumanager.pro/api/v1/ich \ -H "Authorization: Bearer bmp_IHR_SCHLUESSEL"
Basis-Adresse: https://baumanager.pro/api/v1
Authentifizierung
Jede Anfrage braucht einen API-Schlüssel im Kopf Authorization: Bearer <Schlüssel> (alternativ X-API-Key: <Schlüssel>). Schlüssel beginnen mit bmp_ und werden nur einmal beim Anlegen angezeigt.
| Berechtigung | Darf |
|---|---|
| Nur lesen | alle GET-Endpunkte inkl. PDF und E-Rechnung |
| Lesen und schreiben | zusätzlich Anlegen und Ändern (POST, PATCH) |
Ein Schlüssel gilt nur für den eigenen Betrieb und handelt mit Administratorrechten. Er wird ungültig, wenn er widerrufen wird oder abläuft, wenn sein Ersteller kein aktiver Administrator mehr ist oder der Tarif keinen API-Zugang mehr enthält.
Wichtig: Die API ist für Server-zu-Server-Verbindungen gedacht. Den Schlüssel nie in Webseiten, Apps oder JavaScript einbauen, die Dritte sehen können. Nur HTTPS.
Anfragen und Antworten
Anfragen mit Inhalt (POST, PATCH) senden JSON mit Content-Type: application/json (höchstens 1 MB). Feldnamen sind deutsch, wie in der App. Datumsangaben im Format JJJJ-MM-TT, Zeitpunkte nach ISO 8601 mit Zeitzone, Beträge als Zahl mit Dezimalpunkt (netto, Euro).
Einzelner Datensatz
{ "data": { "id": 42, "nummer": "P-2026-0007", "name": "EFH Müller", … } }
Liste mit Seiten
{
"data": [ { … }, { … } ],
"meta": { "seite": 1, "pro_seite": 25, "gesamt": 137, "seiten": 6 }
}
Parameter für alle Listen: seite (ab 1) und pro_seite (1–100, Standard 25). Sortierung: neueste zuerst. Für die Synchronisation geaendert_seit nutzen und den Zeitpunkt der letzten Abfrage speichern.
PATCH ändert nur die übergebenen Felder (PUT wird gleich behandelt). Unbekannte Felder werden nicht still ignoriert, sondern als Fehler gemeldet.
Endpunkte
Verbindung prüfen: Betrieb, Schlüssel und Limit
Kunden auflisten
Einzelnen Kunden abrufen
Kunden anlegen
Kundendaten ändern (nur übergebene Felder)
Projekte auflisten
Einzelnes Projekt abrufen
Projekt anlegen
Projekt ändern (nur übergebene Felder)
Angebote auflisten
Angebot mit Positionen abrufen
Angebot als Entwurf anlegen
Angebot als PDF herunterladen
Rechnungen auflisten
Rechnung mit Positionen und Zahlungen abrufen
Rechnung als Entwurf anlegen
Rechnung als PDF herunterladen
Rechnung als E-Rechnung (XRechnung 3.0, CII) herunterladen
Kunden
Filter für GET /api/v1/kunden
| Parameter | Bedeutung |
|---|---|
suche | Teil von Name, Firmenname, E-Mail oder Kundennummer |
status | Status (siehe Felder der Ressource): active, inactive |
geaendert_seit | Nur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation |
Felder
| Feld | Typ | Anlegen / Ändern | Beschreibung |
|---|---|---|---|
id | Ganzzahl | nur lesen | Eindeutige ID |
kundennummer | Text (max. 30) | nur lesen | Kundennummer (vergibt BauManager Pro) |
typ | privat | firma | optional | Privat- oder Geschäftskunde (Standard: privat) |
firmenname | Text (max. 255) | optional | Firmenname — Pflicht, wenn kein Nachname angegeben ist |
anrede | Herr | Frau | Firma | Divers | optional | Anrede (leer = neutrale Anrede) |
vorname | Text (max. 100) | optional | Vorname |
nachname | Text (max. 100) | optional | Nachname — Pflicht, wenn kein Firmenname angegeben ist |
email | optional | E-Mail-Adresse | |
telefon | Text (max. 50) | optional | Telefon |
mobil | Text (max. 50) | optional | Mobil |
strasse | Text (max. 255) | optional | Straße und Hausnummer |
plz | Text (max. 10) | optional | Postleitzahl |
ort | Text (max. 100) | optional | Ort |
land | Text (max. 100) | optional | Land (Standard: Deutschland) |
ust_id | Text (max. 50) | optional | USt-IdNr. |
leitweg_id | Text (max. 50) | optional | Leitweg-ID für E-Rechnungen an öffentliche Auftraggeber |
notizen | Text (max. 5000) | optional | Interne Notizen |
status | active | inactive | optional | Aktiv oder inaktiv |
created_at | Zeitpunkt | nur lesen | Angelegt am |
updated_at | Zeitpunkt | nur lesen | Zuletzt geändert am |
Beispiel: anlegen
curl -X POST https://baumanager.pro/api/v1/kunden \
-H "Authorization: Bearer bmp_IHR_SCHLUESSEL" \
-H "Content-Type: application/json" \
-d '{ "typ": "firma", "firmenname": "Müller Immobilien GmbH", "email": "info@mueller-immobilien.de",
"strasse": "Hauptstraße 5", "plz": "50667", "ort": "Köln", "ust_id": "DE123456789" }'
→ 201 Created, Location: /api/v1/kunden/57
{ "data": { "id": 57, "kundennummer": "K-00057", "typ": "firma", … } }
Projekte
Filter für GET /api/v1/projekte
| Parameter | Bedeutung |
|---|---|
status | Status (siehe Felder der Ressource): anfrage, angebot, beauftragt, in_arbeit, abnahme, abgeschlossen, storniert |
kunde_id | Nur Datensätze dieses Kunden |
geaendert_seit | Nur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation |
Felder
| Feld | Typ | Anlegen / Ändern | Beschreibung |
|---|---|---|---|
id | Ganzzahl | nur lesen | Eindeutige ID |
nummer | Text (max. 50) | nur lesen | Projektnummer (Nummernkreis des Betriebs) |
name | Text (max. 255) | Pflicht | Bezeichnung, z. B. „EFH Müller“ |
kunde_id | ID (Kunde) | optional | Kunde |
beschreibung | Text (max. 5000) | optional | Beschreibung |
typ | neubau | umbau | sanierung | wartung | sonstiges | optional | Projektart (Standard: neubau) |
status | anfrage | angebot | beauftragt | in_arbeit | abnahme | abgeschlossen | storniert | optional | Status (Standard: anfrage) |
strasse | Text (max. 255) | optional | Baustelle: Straße |
plz | Text (max. 10) | optional | Baustelle: PLZ |
ort | Text (max. 100) | optional | Baustelle: Ort |
land | Text (max. 100) | optional | Baustelle: Land |
start_datum | Datum | optional | Beginn |
end_datum | Datum | optional | Ende |
deadline | Datum | optional | Frist |
budget | Betrag | optional | Budget netto |
kosten_aktuell | Betrag | nur lesen | Bisherige Kosten |
fortschritt | Ganzzahl 0–100 | optional | Fortschritt in % |
verantwortlicher_id | ID (Benutzer) | optional | Verantwortlicher (Benutzer des Betriebs) |
notizen | Text (max. 5000) | optional | Interne Notizen |
created_at | Zeitpunkt | nur lesen | Angelegt am |
updated_at | Zeitpunkt | nur lesen | Zuletzt geändert am |
Beispiel: anlegen
curl -X POST https://baumanager.pro/api/v1/projekte \
-H "Authorization: Bearer bmp_IHR_SCHLUESSEL" \
-H "Content-Type: application/json" \
-d '{ "name": "EFH Müller – Bad", "kunde_id": 57, "typ": "sanierung", "status": "beauftragt",
"strasse": "Lindenweg 3", "plz": "50858", "ort": "Köln", "start_datum": "2026-11-02", "budget": 18500 }'
Angebote
Filter für GET /api/v1/angebote
| Parameter | Bedeutung |
|---|---|
status | Status (siehe Felder der Ressource): entwurf, gesendet, angenommen, abgelehnt, abgelaufen |
kunde_id | Nur Datensätze dieses Kunden |
projekt_id | Nur Datensätze dieses Projekts |
geaendert_seit | Nur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation |
Felder
| Feld | Typ | Anlegen / Ändern | Beschreibung |
|---|---|---|---|
id | Ganzzahl | nur lesen | Eindeutige ID |
nummer | Text (max. 50) | nur lesen | Angebotsnummer (Nummernkreis des Betriebs) |
version | Ganzzahl | nur lesen | Version |
status | entwurf | gesendet | angenommen | abgelehnt | abgelaufen | nur lesen | Status — über die API angelegte Angebote sind Entwürfe |
kunde_id | ID (Kunde) | Pflicht | Kunde |
projekt_id | ID (Projekt) | optional | Projekt |
titel | Text (max. 255) | optional | Titel |
einleitung | Text (max. 5000) | optional | Einleitungstext |
schlusstext | Text (max. 5000) | optional | Schlusstext |
datum | Datum | optional | Angebotsdatum (Standard: heute) |
gueltig_bis | Datum | optional | Gültig bis (Standard: +30 Tage) |
steuer_modus | standard | reverse_charge | kleinunternehmer | optional | MwSt., § 13b UStG (nur Geschäftskunden) oder § 19 UStG — Standard wie in der App |
mwst_satz | Prozent | optional | MwSt.-Satz in % (Standard: Satz des Betriebs) |
rabatt_prozent | Prozent | optional | Rabatt in % |
netto_summe | Betrag | nur lesen | Netto |
mwst_betrag | Betrag | nur lesen | MwSt. |
brutto_summe | Betrag | nur lesen | Brutto |
gesendet_am | Zeitpunkt | nur lesen | Versendet am |
angenommen_am | Zeitpunkt | nur lesen | Angenommen am |
positionen | Liste (Positionen) | Pflicht | Positionen (siehe unten), mindestens eine |
created_at | Zeitpunkt | nur lesen | Angelegt am |
updated_at | Zeitpunkt | nur lesen | Zuletzt geändert am |
Beispiel: anlegen
curl -X POST https://baumanager.pro/api/v1/angebote \
-H "Authorization: Bearer bmp_IHR_SCHLUESSEL" \
-H "Content-Type: application/json" \
-d '{ "kunde_id": 57, "projekt_id": 12, "titel": "Badsanierung",
"positionen": [
{ "typ": "titel", "bezeichnung": "Fliesenarbeiten" },
{ "bezeichnung": "Wandfliesen verlegen\nInkl. Kleber und Fugenmaterial", "menge": 24.5, "einheit": "m²", "einzelpreis": 48, "kostenart": "lohn" },
{ "produkt_id": 311, "menge": 3 } ] }'
→ 201 Created — Entwurf mit Nummer, Summen und Positionen
Rechnungen
Filter für GET /api/v1/rechnungen
| Parameter | Bedeutung |
|---|---|
status | Status (siehe Felder der Ressource): entwurf, gesendet, teilbezahlt, bezahlt, ueberfaellig, storniert |
typ | Rechnungstyp: rechnung, abschlag, schlussrechnung, gutschrift, storno |
kunde_id | Nur Datensätze dieses Kunden |
projekt_id | Nur Datensätze dieses Projekts |
datum_von | Belegdatum ab (JJJJ-MM-TT) |
datum_bis | Belegdatum bis (JJJJ-MM-TT) |
geaendert_seit | Nur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation |
Felder
| Feld | Typ | Anlegen / Ändern | Beschreibung |
|---|---|---|---|
id | Ganzzahl | nur lesen | Eindeutige ID |
nummer | Text (max. 50) | nur lesen | Rechnungsnummer (Nummernkreis des Betriebs, lückenlos) |
typ | rechnung | abschlag | schlussrechnung | gutschrift | storno | nur lesen | Rechnungstyp — über die API: rechnung |
status | entwurf | gesendet | teilbezahlt | bezahlt | ueberfaellig | storniert | nur lesen | Status — über die API angelegte Rechnungen sind Entwürfe |
kunde_id | ID (Kunde) | Pflicht | Kunde |
projekt_id | ID (Projekt) | optional | Projekt |
angebot_id | Ganzzahl | nur lesen | Zugrunde liegendes Angebot |
titel | Text (max. 255) | optional | Titel |
einleitung | Text (max. 5000) | optional | Einleitungstext |
schlusstext | Text (max. 5000) | optional | Schlusstext |
zahlungsbedingungen | Text (max. 2000) | optional | Zahlungsbedingungen (leer = Standardtext) |
datum | Datum | optional | Rechnungsdatum (Standard: heute) |
leistungsdatum | Datum | optional | Leistungsdatum bzw. Beginn des Leistungszeitraums |
leistungszeitraum_bis | Datum | optional | Ende des Leistungszeitraums |
zahlungsziel_tage | Ganzzahl 0–365 | optional | Zahlungsziel in Tagen (Standard: 14) |
faellig_am | Datum | nur lesen | Fällig am (Rechnungsdatum + Zahlungsziel) |
steuer_modus | standard | reverse_charge | kleinunternehmer | optional | MwSt., § 13b UStG (nur Geschäftskunden) oder § 19 UStG — Standard wie in der App |
mwst_satz | Prozent | optional | MwSt.-Satz in % (Standard: Satz des Betriebs) |
rabatt_prozent | Prozent | optional | Rabatt in % |
netto_summe | Betrag | nur lesen | Netto |
mwst_betrag | Betrag | nur lesen | MwSt. |
brutto_summe | Betrag | nur lesen | Brutto |
bereits_gezahlt | Betrag | nur lesen | Bereits gezahlt |
offener_betrag | Betrag | nur lesen | Offener Betrag |
bezahlt_am | Datum | nur lesen | Bezahlt am |
gesendet_am | Zeitpunkt | nur lesen | Versendet am |
mahnstufe | Ganzzahl | nur lesen | Mahnstufe |
storno_von_id | Ganzzahl | nur lesen | Bei Stornorechnungen: die stornierte Rechnung |
positionen | Liste (Positionen) | Pflicht | Positionen (siehe unten), mindestens eine |
zahlungen | Liste (datum, betrag, zahlungsart, referenz) | nur lesen | Zahlungseingänge (nur Einzelabruf) |
created_at | Zeitpunkt | nur lesen | Angelegt am |
updated_at | Zeitpunkt | nur lesen | Zuletzt geändert am |
Beispiel: anlegen
curl -X POST https://baumanager.pro/api/v1/rechnungen \
-H "Authorization: Bearer bmp_IHR_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: shop-auftrag-10293" \
-d '{ "kunde_id": 57, "leistungsdatum": "2026-10-15", "zahlungsziel_tage": 14,
"positionen": [ { "bezeichnung": "Wartung Gasheizung", "menge": 1, "einzelpreis": 189, "kostenart": "lohn" } ] }'
curl https://baumanager.pro/api/v1/rechnungen/845/pdf -H "Authorization: Bearer bmp_IHR_SCHLUESSEL" -o Rechnung.pdf
curl https://baumanager.pro/api/v1/rechnungen/845/xrechnung -H "Authorization: Bearer bmp_IHR_SCHLUESSEL" -o XRechnung.xml
Positionen
Angebote und Rechnungen enthalten positionen — eine Liste in der gewünschten Reihenfolge (höchstens 500, mindestens eine vom Typ position). Mit produkt_id werden Bezeichnung, Einheit und Verkaufspreis aus dem Produktkatalog übernommen, sofern nicht angegeben; es gelten dieselben Regeln wie in der App (nur Artikel des Verkaufskatalogs). Steht in bezeichnung ein Zeilenumbruch, wird ab der zweiten Zeile ein Langtext. Für Artikel mit Maßen kann parameter (Objekt, z. B. {"breite": 1.2}) mitgegeben werden.
| Feld | Typ | Anlegen / Ändern | Beschreibung |
|---|---|---|---|
typ | position | titel | text | optional | position (Standard), titel = Zwischenüberschrift, text = reiner Text ohne Betrag |
produkt_id | Ganzzahl | optional | Artikel aus dem Produktkatalog — Bezeichnung, Einheit und Preis werden übernommen, wenn nicht angegeben |
bezeichnung | Text (max. 255) | optional | Kurztext — Pflicht ohne produkt_id |
beschreibung | Text (max. 5000) | optional | Langtext |
menge | Zahl | optional | Menge (Standard: 1) |
einheit | Text (max. 20) | optional | Einheit, z. B. Stk, m², h (Standard: Stk) |
einzelpreis | Betrag | optional | Einzelpreis netto |
gesamtpreis | Betrag | nur lesen | Menge × Einzelpreis |
kostenart | lohn | material | maschine | sonstiges | optional | Kostenart (lohn = Lohnanteil für § 35a EStG) |
Über die API angelegte Angebote und Rechnungen sind Entwürfe: Nummer, MwSt.-Regeln (§ 13b, § 19 UStG), Tariflimits und Summen wie in der App. Prüfen, Versenden und Stornieren erfolgen in BauManager Pro — so bleibt jede versendete Rechnung GoBD-konform unverändert.
Fehler
Fehler haben einen HTTP-Status und einen stabilen code für Programme; message ist für Menschen (deutsch). Bei ungültigen Eingaben stehen alle Probleme auf einmal in felder.
{
"error": {
"code": "validierung",
"message": "Eingaben ungültig.",
"felder": { "email": "Keine gültige E-Mail-Adresse.", "positionen[0].menge": "Erlaubt: 0.001 bis 9999999.999." }
}
}
| Status | code | Bedeutung |
|---|---|---|
| 400 | json_ungueltig | Inhalt ist kein gültiges JSON-Objekt |
| 400 | filter_ungueltig | Unbekannter oder ungültiger Parameter |
| 400 | seite_ungueltig | seite / pro_seite außerhalb des Bereichs |
| 401 | nicht_angemeldet | Kein Schlüssel gesendet |
| 401 | schluessel_ungueltig | Schlüssel unbekannt oder falsches Format |
| 401 | schluessel_widerrufen | Schlüssel wurde widerrufen |
| 401 | schluessel_abgelaufen | Gültigkeitsdatum überschritten |
| 401 | ersteller_ungueltig | Ersteller ist kein aktiver Administrator mehr |
| 403 | nur_lesen | Schlüssel darf nur lesen |
| 403 | kein_api_zugang | Tarif ohne API-Zugang |
| 403 | konto_nur_lesen | Abonnement abgelaufen — nur Lesen möglich |
| 403 | tarif_grenze | Tariflimit erreicht (z. B. Kunden, Rechnungen pro Monat) |
| 403 | demo | In der Live-Demo nicht verfügbar |
| 404 | nicht_gefunden | Endpunkt oder Datensatz nicht vorhanden (auch fremde Datensätze) |
| 405 | methode_nicht_erlaubt | Methode nicht erlaubt (siehe Kopf Allow) |
| 413 | zu_gross | Anfrage größer als 1 MB |
| 415 | nur_json | Content-Type ist nicht application/json |
| 422 | validierung | Eingaben ungültig — Details in felder |
| 422 | idempotency_key_konflikt | Idempotency-Key schon für eine andere Anfrage benutzt |
| 422 | erechnung_unvollstaendig | Für die XRechnung fehlen Angaben (Liste in felder.fehlt) |
| 429 | limit_erreicht | Stundenlimit erreicht — Retry-After beachten |
| 500 | serverfehler | Interner Fehler — später erneut versuchen |
Limits und Idempotenz
Je Betrieb gilt ein Stundenlimit für alle Schlüssel zusammen (im Tarif Enterprise: 1.000 Anfragen pro Stunde). Jede Antwort enthält X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Zeit). Bei Überschreitung folgt 429 mit Retry-After in Sekunden.
Doppelte Belege vermeiden
Senden Sie bei POST den Kopf Idempotency-Key (8–100 Zeichen, z. B. Ihre Auftragsnummer). Wird die Anfrage nach einem Verbindungsabbruch mit demselben Schlüssel wiederholt, liefert die API innerhalb von 24 Stunden die ursprüngliche Antwort (Kopf Idempotent-Replayed: true) — es entsteht keine zweite Rechnung.
curl -X POST https://baumanager.pro/api/v1/rechnungen \
-H "Authorization: Bearer bmp_IHR_SCHLUESSEL" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: shop-auftrag-10293" \
-d '{ "kunde_id": 15, "positionen": [ { "bezeichnung": "Wartung Heizung", "menge": 1, "einzelpreis": 189 } ] }'
Versionen
Die Version steht in der Adresse (/api/v1) und im Kopf X-API-Version. Neue Felder und Endpunkte können ohne neue Version hinzukommen — Programme sollten unbekannte Felder in Antworten ignorieren. Inkompatible Änderungen erscheinen nur unter einer neuen Version.
| Version | Datum | Änderungen |
|---|---|---|
| 1.0 | 20.10.2026 | Kunden, Projekte, Angebote, Rechnungen (Lesen, Anlegen, Ändern), PDF und XRechnung, Idempotenz, Stundenlimit |