Dokumentation · API-Referenz

Wiresphere REST-API

Vollständige Entwicklerdokumentation für die Wiresphere REST-API. Diese API ermöglicht die Verwaltung von Produkten, Transaktionen, Kundenkontakten, Zahlungen und Shop-Einstellungen im Kontext eines mandantenfähigen Systems.

Auf einen Blick: OpenAPI 3.0.1 · Basis-URL https://api.wiresphere.com (PLATZHALTER) · Authentifizierung per Bearer JWT (24 h gültig) · tenant-id-Header bei fast allen Endpunkten Pflicht. Zurück zur Docs-Übersicht.
Authentifizierung

Die API nutzt Token-basierte Authentifizierung (Bearer JWT). Tokens sind 24 Stunden gültig.

1
Token anfordern

Sende username und password an den Auth-Endpunkt. Für Admin-Nutzer darf der tenant-id-Header nicht mitgeschickt werden.

2
Token verwenden

Füge den erhaltenen Token in den Authorization-Header aller gesicherten Anfragen ein:

Authorization: Bearer <dein-token>
3
Token-Ablauf

Tokens sind 24 Stunden gültig. Ein abgelaufener oder ungültiger Token führt zu einem 409 Conflict.

POST
/api/v1/auth/token-auth
Token anfordern — Benutzeranmeldedaten prüfen und JWT zurückgeben

Header-Parameter

NameInTypPflichtBeschreibung
tenant-id header string Nein Shop-Kontext. Muss weggelassen werden bei Admin-Authentifizierung.

Request Body (application/json)

{
  "username": "dein-benutzername",
  "password": "dein-passwort"
}

Antwort

200 Token erfolgreich erstellt
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
401 Ungültige Anmeldedaten
400 Fehlerhafte Anfrage
Tenant-Konzept

Die API ist mandantenfähig. Jede Anfrage muss (bis auf die Authentifizierung als Admin) den Shop-Kontext über den tenant-id-Header identifizieren.

tenant-id Header

Der tenant-id-Header ist bei nahezu allen Endpunkten Pflichtfeld. Er legt fest, in welchem Shop-Kontext die Operation ausgeführt wird. Ohne diesen Header werden Anfragen abgewiesen.

tenant-id: mein-shop-id
Inventar (Produkte)

Verwaltung des Produkt-Inventars eines Shops. Unterstützt CRUD-Operationen sowie Massen-Operationen.

GET
/api/v1/admin/inventory/
Alle Produkte abrufen (paginiert)

Header

NameInPflichtBeschreibung
tenant-idheaderShop-ID
AuthorizationheaderBearer <token>

Query-Parameter

NameTypBeschreibung
pintegerSeite (default: 0)
sintegerSeitengröße (default: 10)
fstring[]Filter: name, SKU, vatClass, status
ostring[]Sortierung: name, SKU, vatClass, status

Antwort (200)

{
  "totalElements": 42,
  "totalPages": 5,
  "size": 10,
  "number": 0,
  "first": true,
  "last": false,
  "content": [
    {
      "base": { /* Produkt-Basisdaten */ },
      "additional": { /* Zusatzdaten */ }
    }
  ]
}
GET
/api/v1/admin/inventory/{sku}
Einzelnes Produkt per SKU abrufen

Pfad-Parameter

NameInBeschreibung
sku*pathEindeutige Produkt-Kennung im Shop (Stock Keeping Unit)

Antwort (200) — ProductDataDTO

{
  "base": { /* Basis-Produktdaten (Name, SKU, Preis usw.) */ },
  "additional": { /* Erweiterte Felder */ }
}
PUT
/api/v1/admin/inventory/
Produkt anlegen oder aktualisieren (Upsert)

Request Body (application/json) — ProductDataDTO

{
  "base": {
    // Pflichtfelder und Produktdaten (Name, SKU, Preis, Status etc.)
  },
  "additional": {
    // Optionale Zusatzfelder
  }
}

Antwort

200 ID des angelegten/aktualisierten Produkts (string)
DELETE
/api/v1/admin/inventory/
Mehrere Produkte anhand ihrer IDs löschen

Request Body (application/json)

["produktId1", "produktId2"]

Antwort

200 Bestätigung (string)
GET
/api/v1/admin/inventory/operations
Verfügbare Massen-Operationen abrufen

Gibt alle registrierten Bulk-Operationen mit ihren Parameter-Schemas zurück.

Antwort (200) — Array von ProductOperationRegistrationDTO

[{
  "operationId": "set-status",
  "description": "Setzt den Status von Produkten",
  "parameterTypes": { "status": "string" },
  "previewProperties": ["status"]
}]
POST
/api/v1/admin/inventory/operations/preview
Massen-Operation vorschau (Dry-Run)

Simuliert eine Bulk-Operation und zeigt Vorher/Nachher-Zustand — ohne Daten zu speichern.

Request Body

{
  "operationId": "set-status",
  "parameters": { "status": "ACTIVE" },
  "confirmAll": false
}
POST
/api/v1/admin/inventory/operations/execute
Massen-Operation ausführen

Führt eine Bulk-Operation auf gefilterten Produkten aus. Ändert Daten dauerhaft.

Query-Parameter

NameBeschreibung
fFilter welche Produkte betroffen sind

Request Body

{
  "operationId": "set-status",
  "parameters": { "status": "INACTIVE" }
}
Transaktionen

Transaktionen umfassen alle Bestellungen, Verträge und Rechnungen. Sowohl ein öffentlicher als auch ein Admin-Endpunkt stehen zur Verfügung.

Verfügbare doctype-Werte

Beim Filtern über doctype sind folgende Werte bekannt: ORDER, CONTRACT, INVOICE

GET
/api/v1/admin/transaction/
Alle Transaktionen abrufen (Admin) — paginiert, filterbar

Filter-Felder (Parameter f)

FeldFormatBeschreibung
min_createdAtISO 8601Erstellt ab Datum
max_createdAtISO 8601Erstellt bis Datum
doctypeORDER/CONTRACT/INVOICETransaktionstyp
docIdstringDokument-ID
processIdstringProzess-ID
processTypestringProzess-Pipeline
payload.channelstringVerkaufskanal
payload.emailstringE-Mail des Kunden

Sortierfelder (Parameter o)

createdAt, docId, payload.netTotalPrice, payload.grossTotalPrice, payload.customer.name

Beispiel

GET /api/v1/admin/transaction/?f=doctype::ORDER,min_createdAt::2024-01-01T00:00:00.000Z&o=createdAt::DESC&p=0&s=20
Authorization: Bearer <token>
tenant-id: mein-shop
GET
/api/v1/admin/transaction/{processId}/{docId}
Einzelne Transaktion abrufen

Pfad-Parameter

NameBeschreibung
processId*Prozess-ID (gruppiert zusammengehörige Transaktionen)
docId*Dokument-ID der spezifischen Transaktion
GET
/api/v1/admin/transaction/filter-values
Distinct-Werte für Filter abrufen

Query-Parameter

NamePflichtBeschreibung
propsFelder, für die distinct-Werte ermittelt werden sollen
andNeinAND-Vorfilter
orNeinOR-Vorfilter

Antwort (200)

{
  "doctype": ["ORDER", "INVOICE"],
  "payload.channel": ["online", "terminal"]
}
POST
/api/v1/admin/transaction/{processId}/{docId}/cancel
Einzelne Transaktion stornieren

Pfad-Parameter

NameBeschreibung
processId*Prozess-ID
docId*Dokument-ID der zu stornierenden Transaktion

Query-Parameter

NameBeschreibung
reasonOptionaler Stornierungsgrund
POST
/api/v1/admin/transaction/{processId}/cancel
Gesamten Prozess (alle Transaktionen) stornieren

Pfad-Parameter

NameBeschreibung
processId*Prozess-ID — alle zugehörigen Transaktionen werden storniert

Query-Parameter

NameBeschreibung
reasonOptionaler Stornierungsgrund
GET
/api/v1/transaction/
Transaktionen abrufen (öffentlicher Endpunkt — kein Bearer erforderlich)

Identische Filter- und Sortieroptionen wie der Admin-Endpunkt, jedoch ohne Bearer-Authentifizierung. Filtert auf den im Shop-Kontext zugänglichen Daten.

Personen (CRM)

CRM-Verwaltung von Personen (Kunden, Kontakte). Es existieren zwei parallele Controller-Pfade mit identischer Funktionalität.

Parallele Endpunkte

Personen sind über zwei Pfade verwaltbar: /api/v1/admin/person/ und /api/v1/admin/business-contacts/people/. Beide liefern die gleiche Funktionalität — bevorzuge den business-contacts-Pfad für neue Integrationen.

GET
/api/v1/admin/person/all
Alle Personen abrufen (paginiert)

Filter-Felder (Parameter f)

personId, firstName, lastName, email

Antwort (200) — PageCrmPersonDTO

{
  "totalElements": 100,
  "content": [{
    "id": "507f1f77bcf86cd799439011",
    "firstName": "Max",
    "lastName": "Mustermann",
    "email": "max@example.com",
    "personId": "extern-123",
    "addresses": [],
    "communications": [],
    "organisations": [],
    "types": []
  }]
}
GET
/api/v1/admin/person/{id}
Einzelne Person abrufen

Pfad-Parameter

NameBeschreibung
id*MongoDB ObjectId der Person
POST
/api/v1/admin/person
Person anlegen

Request Body (application/json) — PersonDTO

{
  "firstName": "Max",
  "lastName": "Mustermann",
  "email": "max@example.com",
  "salutation": "Herr",
  "title": "Dr.",
  "personId": "externe-id-123",
  "addresses": [{
    "street": "Musterstraße",
    "streetNumber": "1",
    "zipCode": "12345",
    "city": "Musterstadt",
    "country": "DE",
    "type": "MAIN"
  }],
  "communications": [{
    "type": "PHONE",
    "value": "+49 123 4567890"
  }],
  "types": []
}
PUT
/api/v1/admin/person/{id}
Person aktualisieren

Gleicher Request Body wie POST. Vollständige Ersetzung des Datensatzes.

PATCH
/api/v1/admin/person/{id}/organisations
Organisations-Zuordnung einer Person anpassen

Request Body — RelationDeltaDTO

{
  "add": ["orgId1", "orgId2"],
  "remove": ["orgIdAlt"]
}
DELETE
/api/v1/admin/person/{id}
Person löschen

Antwort (200) — OkDTO

{ "ok": true }
DELETE
/api/v1/admin/person/bulk-delete
Mehrere Personen gleichzeitig löschen

Request Body

["id1", "id2", "id3"]
Organisationen (CRM)

Verwaltung von Firmen und Organisationen. Analog zu Personen auch über zwei parallele Pfade erreichbar.

GET
/api/v1/admin/organisation/all
Alle Organisationen abrufen (paginiert)

Filter-Felder

name (Substring-Suche)

Antwort (200) — PageCrmOrganisationDTO

{
  "totalElements": 10,
  "content": [{
    "id": "...",
    "name": "Muster GmbH",
    "organisationId": "externe-id",
    "addresses": [],
    "communications": [],
    "people": [],
    "types": []
  }]
}
POST
/api/v1/admin/organisation
Organisation anlegen

Request Body — OrganisationDTO

{
  "name": "Muster GmbH",
  "organisationId": "externe-id",
  "addresses": [],
  "communications": [],
  "types": []
}
PATCH
/api/v1/admin/organisation/{id}/people
Personen-Zuordnung einer Organisation anpassen

Request Body — RelationDeltaDTO

{
  "add": ["personId1"],
  "remove": []
}
Katalog / Slugs

Slugs definieren URL-Routen im Shop und präsentieren entweder einzelne Produkte (product) oder Produktlisten (product-list).

GET
/api/v1/admin/catalog/
Alle Slugs abrufen (paginiert)

Antwort — PageSlug

{
  "content": [{
    "id": "507f...",
    "slug": "beton-c25-30",
    "label": "Beton C25/30",
    "objectType": "product",
    "collection": "products",
    "refId": "produktMongoId",
    "inactive": false
  }]
}
PUT
/api/v1/admin/catalog/
Slug anlegen oder aktualisieren (Upsert)

Request Body — Slug

{
  "id": "507f...",           // Bei Update angeben
  "slug": "mein-slug",       // URL-Segment (Pflicht)
  "collection": "products",  // MongoDB-Collection (Pflicht)
  "objectType": "product",   // "product" oder "product-list" (Pflicht)
  "refId": "...",            // Produkt-ID (bei objectType "product")
  "fields": {                  // Filter für "product-list"
    "category": "beton"
  },
  "defaultSort": [{ "field": "name", "direction": "asc" }],
  "context": ["main-nav"],
  "inactive": false
}
GET
/api/v1/admin/catalog/ref-id/{refId}
Slug anhand der Referenz-ID (Produkt-ID) abrufen

Nützlich, um den Slug zu einem bekannten Produkt zu finden.

POST
/api/v1/admin/catalog/create-slugs/{fieldName}
Slugs automatisch generieren lassen

Pfad-Parameter

NameBeschreibung
fieldName*Produktfeld, aus dem Slugs generiert werden

Query-Parameter

NameBeschreibung
valuesOptionale Einschränkung auf bestimmte Feldwerte
Kategorien & Navigation
GET
/api/v1/category/navigation
Navigation abrufen (öffentlich)

Query-Parameter

NameBeschreibung
navScopeOptionaler Filter auf Navigation-Kontext
GET
/api/v1/admin/category/navigation-contexts
Verfügbare Navigation-Kontexte abrufen

Antwort (200)

["main-nav", "footer", "sidebar"]
PUT
/api/v1/admin/category/items/order
Reihenfolge von Elementen in einer Kategorie aktualisieren

Request Body — Array von ItemOrderDTO

[
  { "sku": "SKU-001", "categoryId": "catId", "order": 0 },
  { "sku": "SKU-002", "categoryId": "catId", "order": 1 }
]
POST
/api/v1/admin/category/update-slug-navigations
Slug zu Navigation(en) hinzufügen (idempotent)

Request Body — NavigationUpdateDTO

{
  "slugId": "slugMongoId",
  "navigationNames": ["main-nav", "footer"]
}
Einstellungen
GET
/api/v1/admin/settings/{key}
Einstellung per Key abrufen

Pfad-Parameter

NameBeschreibung
key*Einstellungsschlüssel
PUT
/api/v1/admin/settings
Einstellung anlegen oder aktualisieren

Request Body — Setting

{
  "key": "einstellungs-key",
  "public": {
    // Öffentlich zugängliche Einstellungen
    "theme": "dark"
  },
  "private": {
    // Nur für authentifizierte Anfragen zugänglich
    "apiKey": "secret"
  }
}
Dateiverwaltung
GET
/api/v1/admin/files/
Dateien/Bilder auflisten

Query-Parameter

NameBeschreibung
pSeite
sSeitengröße
fDateinamen-Filter
mimeMIME-Type-Filter (z.B. image/png)
POST
/api/v1/admin/files/
Datei hochladen

Request als multipart/form-data mit dem Feld file.

Content-Type: multipart/form-data

file: [binary data]
Payment / Stripe

Stripe-Integration für Zahlungsabwicklung. Es gibt zwei Modi: Standard Stripe (stripe) und External Stripe (stripe-external).

GET
/api/v1/payment/stripe/public
Öffentliche Stripe-Einstellungen abrufen (z.B. Publishable Key)

Antwort (200)

{ "publishableKey": "pk_live_..." }
GET
/api/v1/payment/stripe/state
Aktuellen Stripe Zahlungsstatus abrufen

Gibt den aktuellen Zahlungsstatus des Shops zurück.

POST
/api/v1/payment/stripe-common/capturable
Stripe Webhook — Zahlungsstatus setzen (Produktion)

Nur für Stripe Webhooks

Dieser Endpunkt ist für eingehende Stripe-Webhook-Events. Der Stripe-Signature-Header ist Pflicht und wird von Stripe automatisch gesetzt.

Header

NameBeschreibung
Stripe-Signature*Von Stripe gesetzter Signatur-Header zur Verifikation
POST
/api/v1/admin/payment/stripe-common/webhook-test
Stripe Webhook testen (Admin)

Antwort (200) — WebhookTestStatusDTO

{
  "sandbox": {
    "mode": "SANDBOX",
    "passed": true,
    "ranAt": "2024-01-15T10:30:00Z",
    "durationMs": 234,
    "pending": false
  },
  "production": { /* analog */ }
}
Import / Export
POST
/api/v1/admin/import/{entity}
Entitäten importieren (CSV/JSON Upload)

Pfad-Parameter

NameBeschreibung
entity*Entitätstyp (z.B. products, persons)

Request Body (multipart)

Content-Type: application/json
file: [binary — CSV oder JSON Datei]

Antwort (200) — UploadResponse

{
  "success": true,
  "importCount": 42
}
GET
/api/v1/admin/export/{entity}
Entitäten exportieren (Datei-Download)

Pfad-Parameter

NameBeschreibung
entity*Entitätstyp (z.B. products, persons)

Antwort

Binär-Datei (string format: binary)

Datenmodelle (Schemas)

Übersicht aller verwendeten Datenstrukturen.

PersonDTO

FeldTypBeschreibung
idstringMongoDB ObjectId
firstNamestringVorname
lastNamestringNachname
emailstringE-Mail-Adresse
salutationstringAnrede
titlestringTitel (z.B. Dr.)
personIdstringExterne/eigene ID
tenantIdintegerTenant-Zuordnung
addressesAddressDTO[]Adressen
communicationsCommunicationDTO[]Kommunikationswege
organisationsOrganisationDTO[]Zugeordnete Organisationen
typesBusinessContactTypeDTO[]Kontakttypen
createdAtdatetimeErstellungszeitpunkt
updatedAtdatetimeLetzter Update

AddressDTO

FeldTypBeschreibung
streetstringStraßenname
streetNumberstringHausnummer
supplementalstringAdresszusatz
zipCodestringPostleitzahl
citystringStadt
countrystringLand (ISO Code z.B. DE)
typestringAdresstyp (z.B. MAIN, BILLING)

Slug

FeldTypPflichtBeschreibung
idstringMongoDB ObjectId
slugstringURL-Subroute des Shops
labelstringLesbarer Name
collectionstringMongoDB-Collection
objectTypestring"product" oder "product-list"
refIdstringProdukt-Referenz (bei product)
fieldsobjectFilter für product-list
contextstring[]Anzeige-Kontexte
defaultSortSortField[]Standardsortierung
inactivebooleanDeaktiviert den Slug

ProductDataDTO

FeldTypBeschreibung
baseobjectBasis-Produktdaten (dynamisch, Shop-spezifisch)
additionalobjectErweiterbare Zusatzfelder

RelationDeltaDTO

Wird für PATCH-Endpunkte genutzt um Relationen (Personen↔Organisationen) zu verwalten.

FeldTypBeschreibung
addstring[]IDs die hinzugefügt werden sollen
removestring[]IDs die entfernt werden sollen

Wiresphere API · OpenAPI 3.0.1 · Dokumentation generiert Mai 2026

Basis-URL: https://api.wiresphere.com · Authentifizierung: Bearer JWT · Token-Gültigkeit: 24 Stunden