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.
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.Die API nutzt Token-basierte Authentifizierung (Bearer JWT). Tokens sind 24 Stunden gültig.
Sende username und password an den Auth-Endpunkt. Für Admin-Nutzer darf der tenant-id-Header nicht mitgeschickt werden.
Füge den erhaltenen Token in den Authorization-Header aller gesicherten Anfragen ein:
Authorization: Bearer <dein-token>
Tokens sind 24 Stunden gültig. Ein abgelaufener oder ungültiger Token führt zu einem 409 Conflict.
Header-Parameter
| Name | In | Typ | Pflicht | Beschreibung |
|---|---|---|---|---|
| tenant-id | header | string | Nein | Shop-Kontext. Muss weggelassen werden bei Admin-Authentifizierung. |
Request Body (application/json)
{
"username": "dein-benutzername",
"password": "dein-passwort"
}
Antwort
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
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
Listen-Endpunkte unterstützen einheitliche Query-Parameter für Pagination, Filterung und Sortierung.
Query-Parameter (Listenendpunkte)
| Parameter | Default | Beschreibung |
|---|---|---|
| p | 0 | Seitennummer (0-basiert) |
| s | 10 | Einträge pro Seite |
| f | — | Filterausdruck (siehe unten) |
| o | — | Sortierausdruck (siehe unten) |
Filter-Syntax (Parameter f)
Filter werden als Schlüssel-Wert-Gruppen angegeben:
# Einfacher Filter (Substring-Suche) f=fieldName::value # Mehrere Werte (ODER-verknüpft) f=fieldName::val1~~val2 # Ausschließen (Präfix --) f=fieldName::--ausgeschlossenValue # Kombination f=name::Max~~--Moritz,email::@example.com # Zeitraum-Filter (ISO 8601) f=min_createdAt::2024-01-01T00:00:00.000Z f=max_createdAt::2024-12-31T23:59:59.999Z
Sortier-Syntax (Parameter o)
# Aufsteigend o=name::ASC # Absteigend o=createdAt::DESC # Mehrere Felder o=createdAt::DESC,name::ASC
Verwaltung des Produkt-Inventars eines Shops. Unterstützt CRUD-Operationen sowie Massen-Operationen.
Header
| Name | In | Pflicht | Beschreibung |
|---|---|---|---|
| tenant-id | header | Shop-ID | |
| Authorization | header | Bearer <token> |
Query-Parameter
| Name | Typ | Beschreibung |
|---|---|---|
| p | integer | Seite (default: 0) |
| s | integer | Seitengröße (default: 10) |
| f | string[] | Filter: name, SKU, vatClass, status |
| o | string[] | 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 */ }
}
]
}
Pfad-Parameter
| Name | In | Beschreibung |
|---|---|---|
| sku* | path | Eindeutige Produkt-Kennung im Shop (Stock Keeping Unit) |
Antwort (200) — ProductDataDTO
{
"base": { /* Basis-Produktdaten (Name, SKU, Preis usw.) */ },
"additional": { /* Erweiterte Felder */ }
}
Request Body (application/json) — ProductDataDTO
{
"base": {
// Pflichtfelder und Produktdaten (Name, SKU, Preis, Status etc.)
},
"additional": {
// Optionale Zusatzfelder
}
}
Antwort
Request Body (application/json)
["produktId1", "produktId2"]
Antwort
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"]
}]
Simuliert eine Bulk-Operation und zeigt Vorher/Nachher-Zustand — ohne Daten zu speichern.
Request Body
{
"operationId": "set-status",
"parameters": { "status": "ACTIVE" },
"confirmAll": false
}
Führt eine Bulk-Operation auf gefilterten Produkten aus. Ändert Daten dauerhaft.
Query-Parameter
| Name | Beschreibung |
|---|---|
| f | Filter welche Produkte betroffen sind |
Request Body
{
"operationId": "set-status",
"parameters": { "status": "INACTIVE" }
}
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
Filter-Felder (Parameter f)
| Feld | Format | Beschreibung |
|---|---|---|
| min_createdAt | ISO 8601 | Erstellt ab Datum |
| max_createdAt | ISO 8601 | Erstellt bis Datum |
| doctype | ORDER/CONTRACT/INVOICE | Transaktionstyp |
| docId | string | Dokument-ID |
| processId | string | Prozess-ID |
| processType | string | Prozess-Pipeline |
| payload.channel | string | Verkaufskanal |
| payload.email | string | E-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
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| processId* | Prozess-ID (gruppiert zusammengehörige Transaktionen) |
| docId* | Dokument-ID der spezifischen Transaktion |
Query-Parameter
| Name | Pflicht | Beschreibung |
|---|---|---|
| props | Felder, für die distinct-Werte ermittelt werden sollen | |
| and | Nein | AND-Vorfilter |
| or | Nein | OR-Vorfilter |
Antwort (200)
{
"doctype": ["ORDER", "INVOICE"],
"payload.channel": ["online", "terminal"]
}
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| processId* | Prozess-ID |
| docId* | Dokument-ID der zu stornierenden Transaktion |
Query-Parameter
| Name | Beschreibung |
|---|---|
| reason | Optionaler Stornierungsgrund |
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| processId* | Prozess-ID — alle zugehörigen Transaktionen werden storniert |
Query-Parameter
| Name | Beschreibung |
|---|---|
| reason | Optionaler Stornierungsgrund |
Identische Filter- und Sortieroptionen wie der Admin-Endpunkt, jedoch ohne Bearer-Authentifizierung. Filtert auf den im Shop-Kontext zugänglichen Daten.
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.
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": []
}]
}
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| id* | MongoDB ObjectId der Person |
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": []
}
Gleicher Request Body wie POST. Vollständige Ersetzung des Datensatzes.
Request Body — RelationDeltaDTO
{
"add": ["orgId1", "orgId2"],
"remove": ["orgIdAlt"]
}
Antwort (200) — OkDTO
{ "ok": true }
Request Body
["id1", "id2", "id3"]
Verwaltung von Firmen und Organisationen. Analog zu Personen auch über zwei parallele Pfade erreichbar.
Filter-Felder
name (Substring-Suche)
Antwort (200) — PageCrmOrganisationDTO
{
"totalElements": 10,
"content": [{
"id": "...",
"name": "Muster GmbH",
"organisationId": "externe-id",
"addresses": [],
"communications": [],
"people": [],
"types": []
}]
}
Request Body — OrganisationDTO
{
"name": "Muster GmbH",
"organisationId": "externe-id",
"addresses": [],
"communications": [],
"types": []
}
Request Body — RelationDeltaDTO
{
"add": ["personId1"],
"remove": []
}
Slugs definieren URL-Routen im Shop und präsentieren entweder einzelne Produkte (product) oder Produktlisten (product-list).
Antwort — PageSlug
{
"content": [{
"id": "507f...",
"slug": "beton-c25-30",
"label": "Beton C25/30",
"objectType": "product",
"collection": "products",
"refId": "produktMongoId",
"inactive": false
}]
}
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
}
Nützlich, um den Slug zu einem bekannten Produkt zu finden.
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| fieldName* | Produktfeld, aus dem Slugs generiert werden |
Query-Parameter
| Name | Beschreibung |
|---|---|
| values | Optionale Einschränkung auf bestimmte Feldwerte |
Query-Parameter
| Name | Beschreibung |
|---|---|
| navScope | Optionaler Filter auf Navigation-Kontext |
Antwort (200)
["main-nav", "footer", "sidebar"]
Request Body — Array von ItemOrderDTO
[
{ "sku": "SKU-001", "categoryId": "catId", "order": 0 },
{ "sku": "SKU-002", "categoryId": "catId", "order": 1 }
]
Request Body — NavigationUpdateDTO
{
"slugId": "slugMongoId",
"navigationNames": ["main-nav", "footer"]
}
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| key* | Einstellungsschlüssel |
Request Body — Setting
{
"key": "einstellungs-key",
"public": {
// Öffentlich zugängliche Einstellungen
"theme": "dark"
},
"private": {
// Nur für authentifizierte Anfragen zugänglich
"apiKey": "secret"
}
}
Query-Parameter
| Name | Beschreibung |
|---|---|
| p | Seite |
| s | Seitengröße |
| f | Dateinamen-Filter |
| mime | MIME-Type-Filter (z.B. image/png) |
Request als multipart/form-data mit dem Feld file.
Content-Type: multipart/form-data file: [binary data]
Stripe-Integration für Zahlungsabwicklung. Es gibt zwei Modi: Standard Stripe (stripe) und External Stripe (stripe-external).
Antwort (200)
{ "publishableKey": "pk_live_..." }
Gibt den aktuellen Zahlungsstatus des Shops zurück.
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
| Name | Beschreibung |
|---|---|
| Stripe-Signature* | Von Stripe gesetzter Signatur-Header zur Verifikation |
Antwort (200) — WebhookTestStatusDTO
{
"sandbox": {
"mode": "SANDBOX",
"passed": true,
"ranAt": "2024-01-15T10:30:00Z",
"durationMs": 234,
"pending": false
},
"production": { /* analog */ }
}
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| 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
}
Pfad-Parameter
| Name | Beschreibung |
|---|---|
| entity* | Entitätstyp (z.B. products, persons) |
Antwort
Binär-Datei (string format: binary)
Übersicht aller verwendeten Datenstrukturen.
PersonDTO
| Feld | Typ | Beschreibung |
|---|---|---|
| id | string | MongoDB ObjectId |
| firstName | string | Vorname |
| lastName | string | Nachname |
| string | E-Mail-Adresse | |
| salutation | string | Anrede |
| title | string | Titel (z.B. Dr.) |
| personId | string | Externe/eigene ID |
| tenantId | integer | Tenant-Zuordnung |
| addresses | AddressDTO[] | Adressen |
| communications | CommunicationDTO[] | Kommunikationswege |
| organisations | OrganisationDTO[] | Zugeordnete Organisationen |
| types | BusinessContactTypeDTO[] | Kontakttypen |
| createdAt | datetime | Erstellungszeitpunkt |
| updatedAt | datetime | Letzter Update |
AddressDTO
| Feld | Typ | Beschreibung |
|---|---|---|
| street | string | Straßenname |
| streetNumber | string | Hausnummer |
| supplemental | string | Adresszusatz |
| zipCode | string | Postleitzahl |
| city | string | Stadt |
| country | string | Land (ISO Code z.B. DE) |
| type | string | Adresstyp (z.B. MAIN, BILLING) |
Slug
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
| id | string | — | MongoDB ObjectId |
| slug | string | URL-Subroute des Shops | |
| label | string | — | Lesbarer Name |
| collection | string | MongoDB-Collection | |
| objectType | string | "product" oder "product-list" | |
| refId | string | — | Produkt-Referenz (bei product) |
| fields | object | — | Filter für product-list |
| context | string[] | — | Anzeige-Kontexte |
| defaultSort | SortField[] | — | Standardsortierung |
| inactive | boolean | — | Deaktiviert den Slug |
ProductDataDTO
| Feld | Typ | Beschreibung |
|---|---|---|
| base | object | Basis-Produktdaten (dynamisch, Shop-spezifisch) |
| additional | object | Erweiterbare Zusatzfelder |
RelationDeltaDTO
Wird für PATCH-Endpunkte genutzt um Relationen (Personen↔Organisationen) zu verwalten.
| Feld | Typ | Beschreibung |
|---|---|---|
| add | string[] | IDs die hinzugefügt werden sollen |
| remove | string[] | 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