API-Dokumentation

REST-API v1.0 — BauManager Pro mit Buchhaltung, Website und eigenen Programmen verbinden

Enthalten ab Tarif Enterprise

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.

BerechtigungDarf
Nur lesenalle GET-Endpunkte inkl. PDF und E-Rechnung
Lesen und schreibenzusä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

GET/api/v1/ich

Verbindung prüfen: Betrieb, Schlüssel und Limit

GET/api/v1/kunden

Kunden auflisten

GET/api/v1/kunden/{id}

Einzelnen Kunden abrufen

POST/api/v1/kundenschreiben

Kunden anlegen

PATCH/api/v1/kunden/{id}schreiben

Kundendaten ändern (nur übergebene Felder)

GET/api/v1/projekte

Projekte auflisten

GET/api/v1/projekte/{id}

Einzelnes Projekt abrufen

POST/api/v1/projekteschreiben

Projekt anlegen

PATCH/api/v1/projekte/{id}schreiben

Projekt ändern (nur übergebene Felder)

GET/api/v1/angebote

Angebote auflisten

GET/api/v1/angebote/{id}

Angebot mit Positionen abrufen

POST/api/v1/angeboteschreiben

Angebot als Entwurf anlegen

GET/api/v1/angebote/{id}/pdf

Angebot als PDF herunterladen

GET/api/v1/rechnungen

Rechnungen auflisten

GET/api/v1/rechnungen/{id}

Rechnung mit Positionen und Zahlungen abrufen

POST/api/v1/rechnungenschreiben

Rechnung als Entwurf anlegen

GET/api/v1/rechnungen/{id}/pdf

Rechnung als PDF herunterladen

GET/api/v1/rechnungen/{id}/xrechnung

Rechnung als E-Rechnung (XRechnung 3.0, CII) herunterladen

Kunden

Filter für GET /api/v1/kunden

ParameterBedeutung
sucheTeil von Name, Firmenname, E-Mail oder Kundennummer
statusStatus (siehe Felder der Ressource): active, inactive
geaendert_seitNur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation

Felder

FeldTypAnlegen / ÄndernBeschreibung
idGanzzahlnur lesenEindeutige ID
kundennummerText (max. 30)nur lesenKundennummer (vergibt BauManager Pro)
typprivat | firmaoptionalPrivat- oder Geschäftskunde (Standard: privat)
firmennameText (max. 255)optionalFirmenname — Pflicht, wenn kein Nachname angegeben ist
anredeHerr | Frau | Firma | DiversoptionalAnrede (leer = neutrale Anrede)
vornameText (max. 100)optionalVorname
nachnameText (max. 100)optionalNachname — Pflicht, wenn kein Firmenname angegeben ist
emailE-MailoptionalE-Mail-Adresse
telefonText (max. 50)optionalTelefon
mobilText (max. 50)optionalMobil
strasseText (max. 255)optionalStraße und Hausnummer
plzText (max. 10)optionalPostleitzahl
ortText (max. 100)optionalOrt
landText (max. 100)optionalLand (Standard: Deutschland)
ust_idText (max. 50)optionalUSt-IdNr.
leitweg_idText (max. 50)optionalLeitweg-ID für E-Rechnungen an öffentliche Auftraggeber
notizenText (max. 5000)optionalInterne Notizen
statusactive | inactiveoptionalAktiv oder inaktiv
created_atZeitpunktnur lesenAngelegt am
updated_atZeitpunktnur lesenZuletzt 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

ParameterBedeutung
statusStatus (siehe Felder der Ressource): anfrage, angebot, beauftragt, in_arbeit, abnahme, abgeschlossen, storniert
kunde_idNur Datensätze dieses Kunden
geaendert_seitNur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation

Felder

FeldTypAnlegen / ÄndernBeschreibung
idGanzzahlnur lesenEindeutige ID
nummerText (max. 50)nur lesenProjektnummer (Nummernkreis des Betriebs)
nameText (max. 255)PflichtBezeichnung, z. B. „EFH Müller“
kunde_idID (Kunde)optionalKunde
beschreibungText (max. 5000)optionalBeschreibung
typneubau | umbau | sanierung | wartung | sonstigesoptionalProjektart (Standard: neubau)
statusanfrage | angebot | beauftragt | in_arbeit | abnahme | abgeschlossen | storniertoptionalStatus (Standard: anfrage)
strasseText (max. 255)optionalBaustelle: Straße
plzText (max. 10)optionalBaustelle: PLZ
ortText (max. 100)optionalBaustelle: Ort
landText (max. 100)optionalBaustelle: Land
start_datumDatumoptionalBeginn
end_datumDatumoptionalEnde
deadlineDatumoptionalFrist
budgetBetragoptionalBudget netto
kosten_aktuellBetragnur lesenBisherige Kosten
fortschrittGanzzahl 0–100optionalFortschritt in %
verantwortlicher_idID (Benutzer)optionalVerantwortlicher (Benutzer des Betriebs)
notizenText (max. 5000)optionalInterne Notizen
created_atZeitpunktnur lesenAngelegt am
updated_atZeitpunktnur lesenZuletzt 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

ParameterBedeutung
statusStatus (siehe Felder der Ressource): entwurf, gesendet, angenommen, abgelehnt, abgelaufen
kunde_idNur Datensätze dieses Kunden
projekt_idNur Datensätze dieses Projekts
geaendert_seitNur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation

Felder

FeldTypAnlegen / ÄndernBeschreibung
idGanzzahlnur lesenEindeutige ID
nummerText (max. 50)nur lesenAngebotsnummer (Nummernkreis des Betriebs)
versionGanzzahlnur lesenVersion
statusentwurf | gesendet | angenommen | abgelehnt | abgelaufennur lesenStatus — über die API angelegte Angebote sind Entwürfe
kunde_idID (Kunde)PflichtKunde
projekt_idID (Projekt)optionalProjekt
titelText (max. 255)optionalTitel
einleitungText (max. 5000)optionalEinleitungstext
schlusstextText (max. 5000)optionalSchlusstext
datumDatumoptionalAngebotsdatum (Standard: heute)
gueltig_bisDatumoptionalGültig bis (Standard: +30 Tage)
steuer_modusstandard | reverse_charge | kleinunternehmeroptionalMwSt., § 13b UStG (nur Geschäftskunden) oder § 19 UStG — Standard wie in der App
mwst_satzProzentoptionalMwSt.-Satz in % (Standard: Satz des Betriebs)
rabatt_prozentProzentoptionalRabatt in %
netto_summeBetragnur lesenNetto
mwst_betragBetragnur lesenMwSt.
brutto_summeBetragnur lesenBrutto
gesendet_amZeitpunktnur lesenVersendet am
angenommen_amZeitpunktnur lesenAngenommen am
positionenListe (Positionen)PflichtPositionen (siehe unten), mindestens eine
created_atZeitpunktnur lesenAngelegt am
updated_atZeitpunktnur lesenZuletzt 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

ParameterBedeutung
statusStatus (siehe Felder der Ressource): entwurf, gesendet, teilbezahlt, bezahlt, ueberfaellig, storniert
typRechnungstyp: rechnung, abschlag, schlussrechnung, gutschrift, storno
kunde_idNur Datensätze dieses Kunden
projekt_idNur Datensätze dieses Projekts
datum_vonBelegdatum ab (JJJJ-MM-TT)
datum_bisBelegdatum bis (JJJJ-MM-TT)
geaendert_seitNur seit diesem Zeitpunkt geänderte Datensätze (ISO 8601) — für die Synchronisation

Felder

FeldTypAnlegen / ÄndernBeschreibung
idGanzzahlnur lesenEindeutige ID
nummerText (max. 50)nur lesenRechnungsnummer (Nummernkreis des Betriebs, lückenlos)
typrechnung | abschlag | schlussrechnung | gutschrift | stornonur lesenRechnungstyp — über die API: rechnung
statusentwurf | gesendet | teilbezahlt | bezahlt | ueberfaellig | storniertnur lesenStatus — über die API angelegte Rechnungen sind Entwürfe
kunde_idID (Kunde)PflichtKunde
projekt_idID (Projekt)optionalProjekt
angebot_idGanzzahlnur lesenZugrunde liegendes Angebot
titelText (max. 255)optionalTitel
einleitungText (max. 5000)optionalEinleitungstext
schlusstextText (max. 5000)optionalSchlusstext
zahlungsbedingungenText (max. 2000)optionalZahlungsbedingungen (leer = Standardtext)
datumDatumoptionalRechnungsdatum (Standard: heute)
leistungsdatumDatumoptionalLeistungsdatum bzw. Beginn des Leistungszeitraums
leistungszeitraum_bisDatumoptionalEnde des Leistungszeitraums
zahlungsziel_tageGanzzahl 0–365optionalZahlungsziel in Tagen (Standard: 14)
faellig_amDatumnur lesenFällig am (Rechnungsdatum + Zahlungsziel)
steuer_modusstandard | reverse_charge | kleinunternehmeroptionalMwSt., § 13b UStG (nur Geschäftskunden) oder § 19 UStG — Standard wie in der App
mwst_satzProzentoptionalMwSt.-Satz in % (Standard: Satz des Betriebs)
rabatt_prozentProzentoptionalRabatt in %
netto_summeBetragnur lesenNetto
mwst_betragBetragnur lesenMwSt.
brutto_summeBetragnur lesenBrutto
bereits_gezahltBetragnur lesenBereits gezahlt
offener_betragBetragnur lesenOffener Betrag
bezahlt_amDatumnur lesenBezahlt am
gesendet_amZeitpunktnur lesenVersendet am
mahnstufeGanzzahlnur lesenMahnstufe
storno_von_idGanzzahlnur lesenBei Stornorechnungen: die stornierte Rechnung
positionenListe (Positionen)PflichtPositionen (siehe unten), mindestens eine
zahlungenListe (datum, betrag, zahlungsart, referenz)nur lesenZahlungseingänge (nur Einzelabruf)
created_atZeitpunktnur lesenAngelegt am
updated_atZeitpunktnur lesenZuletzt 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.

FeldTypAnlegen / ÄndernBeschreibung
typposition | titel | textoptionalposition (Standard), titel = Zwischenüberschrift, text = reiner Text ohne Betrag
produkt_idGanzzahloptionalArtikel aus dem Produktkatalog — Bezeichnung, Einheit und Preis werden übernommen, wenn nicht angegeben
bezeichnungText (max. 255)optionalKurztext — Pflicht ohne produkt_id
beschreibungText (max. 5000)optionalLangtext
mengeZahloptionalMenge (Standard: 1)
einheitText (max. 20)optionalEinheit, z. B. Stk, m², h (Standard: Stk)
einzelpreisBetragoptionalEinzelpreis netto
gesamtpreisBetragnur lesenMenge × Einzelpreis
kostenartlohn | material | maschine | sonstigesoptionalKostenart (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." }
  }
}
StatuscodeBedeutung
400json_ungueltigInhalt ist kein gültiges JSON-Objekt
400filter_ungueltigUnbekannter oder ungültiger Parameter
400seite_ungueltigseite / pro_seite außerhalb des Bereichs
401nicht_angemeldetKein Schlüssel gesendet
401schluessel_ungueltigSchlüssel unbekannt oder falsches Format
401schluessel_widerrufenSchlüssel wurde widerrufen
401schluessel_abgelaufenGültigkeitsdatum überschritten
401ersteller_ungueltigErsteller ist kein aktiver Administrator mehr
403nur_lesenSchlüssel darf nur lesen
403kein_api_zugangTarif ohne API-Zugang
403konto_nur_lesenAbonnement abgelaufen — nur Lesen möglich
403tarif_grenzeTariflimit erreicht (z. B. Kunden, Rechnungen pro Monat)
403demoIn der Live-Demo nicht verfügbar
404nicht_gefundenEndpunkt oder Datensatz nicht vorhanden (auch fremde Datensätze)
405methode_nicht_erlaubtMethode nicht erlaubt (siehe Kopf Allow)
413zu_grossAnfrage größer als 1 MB
415nur_jsonContent-Type ist nicht application/json
422validierungEingaben ungültig — Details in felder
422idempotency_key_konfliktIdempotency-Key schon für eine andere Anfrage benutzt
422erechnung_unvollstaendigFür die XRechnung fehlen Angaben (Liste in felder.fehlt)
429limit_erreichtStundenlimit erreicht — Retry-After beachten
500serverfehlerInterner 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.

VersionDatumÄnderungen
1.020.10.2026Kunden, Projekte, Angebote, Rechnungen (Lesen, Anlegen, Ändern), PDF und XRechnung, Idempotenz, Stundenlimit