Wiresphere REST API
Complete developer documentation for the Wiresphere REST API. This API lets you manage products, transactions, customer contacts, payments and shop settings within a multi-tenant system.
https://api.wiresphere.com (PLACEHOLDER) · Authentication via Bearer JWT (valid for 24 h) · tenant-id header required for almost all endpoints. Back to the Docs Overview.The API uses token-based authentication (Bearer JWT). Tokens are valid for 24 hours.
Send username and password to the auth endpoint. For admin users, the tenant-id header must not be included.
Include the received token in the Authorization header of every secured request:
Authorization: Bearer <your-token>
Tokens are valid for 24 hours. An expired or invalid token results in a 409 Conflict.
Header Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| tenant-id | header | string | No | Shop context. Must be omitted for admin authentication. |
Request Body (application/json)
{
"username": "your-username",
"password": "your-password"
}
Response
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
The API is multi-tenant. Every request (except admin authentication) must identify the shop context via the tenant-id header.
tenant-id header
The tenant-id header is required for almost all endpoints. It determines the shop context in which the operation is executed. Requests without this header are rejected.
tenant-id: my-shop-id
List endpoints support uniform query parameters for pagination, filtering and sorting.
Query parameters (list endpoints)
| Parameter | Default | Description |
|---|---|---|
| p | 0 | Page number (0-based) |
| s | 10 | Entries per page |
| f | — | Filter expression (see below) |
| o | — | Sort expression (see below) |
Filter syntax (parameter f)
Filters are specified as key-value groups:
# Simple filter (substring search) f=fieldName::value # Multiple values (OR-combined) f=fieldName::val1~~val2 # Exclude (prefix --) f=fieldName::--excludedValue # Combination f=name::Max~~--Moritz,email::@example.com # Date-range filter (ISO 8601) f=min_createdAt::2024-01-01T00:00:00.000Z f=max_createdAt::2024-12-31T23:59:59.999Z
Sort syntax (parameter o)
# Ascending o=name::ASC # Descending o=createdAt::DESC # Multiple fields o=createdAt::DESC,name::ASC
Management of a shop's product inventory. Supports CRUD operations as well as bulk operations.
Header
| Name | In | Required | Description |
|---|---|---|---|
| tenant-id | header | Shop ID | |
| Authorization | header | Bearer <token> |
Query Parameters
| Name | Type | Description |
|---|---|---|
| p | integer | Page (default: 0) |
| s | integer | Page size (default: 10) |
| f | string[] | Filter: name, SKU, vatClass, status |
| o | string[] | Sorting: name, SKU, vatClass, status |
Response (200)
{
"totalElements": 42,
"totalPages": 5,
"size": 10,
"number": 0,
"first": true,
"last": false,
"content": [
{
"base": { /* base product data */ },
"additional": { /* additional data */ }
}
]
}
Path Parameters
| Name | In | Description |
|---|---|---|
| sku* | path | Unique product identifier within the shop (Stock Keeping Unit) |
Response (200) — ProductDataDTO
{
"base": { /* base product data (name, SKU, price, etc.) */ },
"additional": { /* extended fields */ }
}
Request Body (application/json) — ProductDataDTO
{
"base": {
// Required fields and product data (name, SKU, price, status, etc.)
},
"additional": {
// Optional additional fields
}
}
Response
Request Body (application/json)
["productId1", "productId2"]
Response
Returns all registered bulk operations along with their parameter schemas.
Response (200) — Array of ProductOperationRegistrationDTO
[{
"operationId": "set-status",
"description": "Sets the status of products",
"parameterTypes": { "status": "string" },
"previewProperties": ["status"]
}]
Simulates a bulk operation and shows the before/after state — without saving any data.
Request Body
{
"operationId": "set-status",
"parameters": { "status": "ACTIVE" },
"confirmAll": false
}
Executes a bulk operation on filtered products. Changes data permanently.
Query Parameters
| Name | Description |
|---|---|
| f | Filter determining which products are affected |
Request Body
{
"operationId": "set-status",
"parameters": { "status": "INACTIVE" }
}
Transactions cover all orders, contracts and invoices. Both a public and an admin endpoint are available.
Available doctype values
When filtering by doctype, the following values are known: ORDER, CONTRACT, INVOICE
Filter fields (parameter f)
| Field | Format | Description |
|---|---|---|
| min_createdAt | ISO 8601 | Created from date |
| max_createdAt | ISO 8601 | Created up to date |
| doctype | ORDER/CONTRACT/INVOICE | Transaction type |
| docId | string | Document ID |
| processId | string | Process ID |
| processType | string | Process pipeline |
| payload.channel | string | Sales channel |
| payload.email | string | Customer's email |
Sort fields (parameter o)
createdAt, docId, payload.netTotalPrice, payload.grossTotalPrice, payload.customer.name
Example
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: my-shop
Path Parameters
| Name | Description |
|---|---|
| processId* | Process ID (groups related transactions) |
| docId* | Document ID of the specific transaction |
Query Parameters
| Name | Required | Description |
|---|---|---|
| props | Fields for which distinct values should be determined | |
| and | No | AND pre-filter |
| or | No | OR pre-filter |
Response (200)
{
"doctype": ["ORDER", "INVOICE"],
"payload.channel": ["online", "terminal"]
}
Path Parameters
| Name | Description |
|---|---|
| processId* | Process ID |
| docId* | Document ID of the transaction to cancel |
Query Parameters
| Name | Description |
|---|---|
| reason | Optional cancellation reason |
Path Parameters
| Name | Description |
|---|---|
| processId* | Process ID — all associated transactions are cancelled |
Query Parameters
| Name | Description |
|---|---|
| reason | Optional cancellation reason |
Identical filter and sort options to the admin endpoint, but without Bearer authentication. Filters on the data accessible within the shop context.
CRM management of people (customers, contacts). Two parallel controller paths exist with identical functionality.
Parallel endpoints
People can be managed via two paths: /api/v1/admin/person/ and /api/v1/admin/business-contacts/people/. Both provide the same functionality — prefer the business-contacts path for new integrations.
Filter fields (parameter f)
personId, firstName, lastName, email
Response (200) — PageCrmPersonDTO
{
"totalElements": 100,
"content": [{
"id": "507f1f77bcf86cd799439011",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"personId": "external-123",
"addresses": [],
"communications": [],
"organisations": [],
"types": []
}]
}
Path Parameters
| Name | Description |
|---|---|
| id* | MongoDB ObjectId of the person |
Request Body (application/json) — PersonDTO
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"salutation": "Mr",
"title": "Dr.",
"personId": "external-id-123",
"addresses": [{
"street": "Sample Street",
"streetNumber": "1",
"zipCode": "12345",
"city": "Sampletown",
"country": "DE",
"type": "MAIN"
}],
"communications": [{
"type": "PHONE",
"value": "+49 123 4567890"
}],
"types": []
}
Same request body as POST. Fully replaces the record.
Request Body — RelationDeltaDTO
{
"add": ["orgId1", "orgId2"],
"remove": ["orgIdOld"]
}
Response (200) — OkDTO
{ "ok": true }
Request Body
["id1", "id2", "id3"]
Management of companies and organizations. As with people, also accessible via two parallel paths.
Filter fields
name (substring search)
Response (200) — PageCrmOrganisationDTO
{
"totalElements": 10,
"content": [{
"id": "...",
"name": "Example Inc.",
"organisationId": "external-id",
"addresses": [],
"communications": [],
"people": [],
"types": []
}]
}
Request Body — OrganisationDTO
{
"name": "Example Inc.",
"organisationId": "external-id",
"addresses": [],
"communications": [],
"types": []
}
Request Body — RelationDeltaDTO
{
"add": ["personId1"],
"remove": []
}
Slugs define URL routes in the shop and present either individual products (product) or product lists (product-list).
Response — PageSlug
{
"content": [{
"id": "507f...",
"slug": "beton-c25-30",
"label": "Concrete C25/30",
"objectType": "product",
"collection": "products",
"refId": "productMongoId",
"inactive": false
}]
}
Request Body — Slug
{
"id": "507f...", // Provide when updating
"slug": "my-slug", // URL segment (required)
"collection": "products", // MongoDB collection (required)
"objectType": "product", // "product" or "product-list" (required)
"refId": "...", // Product ID (for objectType "product")
"fields": { // Filter for "product-list"
"category": "beton"
},
"defaultSort": [{ "field": "name", "direction": "asc" }],
"context": ["main-nav"],
"inactive": false
}
Useful for finding the slug of a known product.
Path Parameters
| Name | Description |
|---|---|
| fieldName* | Product field from which slugs are generated |
Query Parameters
| Name | Description |
|---|---|
| values | Optional restriction to specific field values |
Query Parameters
| Name | Description |
|---|---|
| navScope | Optional filter on the navigation context |
Response (200)
["main-nav", "footer", "sidebar"]
Request Body — Array of ItemOrderDTO
[
{ "sku": "SKU-001", "categoryId": "catId", "order": 0 },
{ "sku": "SKU-002", "categoryId": "catId", "order": 1 }
]
Request Body — NavigationUpdateDTO
{
"slugId": "slugMongoId",
"navigationNames": ["main-nav", "footer"]
}
Path Parameters
| Name | Description |
|---|---|
| key* | Settings key |
Request Body — Setting
{
"key": "settings-key",
"public": {
// Publicly accessible settings
"theme": "dark"
},
"private": {
// Accessible to authenticated requests only
"apiKey": "secret"
}
}
Query Parameters
| Name | Description |
|---|---|
| p | Page |
| s | Page size |
| f | Filename filter |
| mime | MIME type filter (e.g. image/png) |
Request as multipart/form-data with the field file.
Content-Type: multipart/form-data file: [binary data]
Stripe integration for payment processing. There are two modes: standard Stripe (stripe) and external Stripe (stripe-external).
Response (200)
{ "publishableKey": "pk_live_..." }
Returns the shop's current payment state.
For Stripe webhooks only
This endpoint is for incoming Stripe webhook events. The Stripe-Signature header is required and is set automatically by Stripe.
Header
| Name | Description |
|---|---|
| Stripe-Signature* | Signature header set by Stripe for verification |
Response (200) — WebhookTestStatusDTO
{
"sandbox": {
"mode": "SANDBOX",
"passed": true,
"ranAt": "2024-01-15T10:30:00Z",
"durationMs": 234,
"pending": false
},
"production": { /* same structure */ }
}
Path Parameters
| Name | Description |
|---|---|
| entity* | Entity type (e.g. products, persons) |
Request Body (multipart)
Content-Type: application/json file: [binary — CSV or JSON file]
Response (200) — UploadResponse
{
"success": true,
"importCount": 42
}
Path Parameters
| Name | Description |
|---|---|
| entity* | Entity type (e.g. products, persons) |
Response
Binary file (string format: binary)
Overview of all data structures in use.
PersonDTO
| Field | Type | Description |
|---|---|---|
| id | string | MongoDB ObjectId |
| firstName | string | First name |
| lastName | string | Last name |
| string | Email address | |
| salutation | string | Salutation |
| title | string | Title (e.g. Dr.) |
| personId | string | External/custom ID |
| tenantId | integer | Tenant assignment |
| addresses | AddressDTO[] | Addresses |
| communications | CommunicationDTO[] | Communication channels |
| organisations | OrganisationDTO[] | Assigned organizations |
| types | BusinessContactTypeDTO[] | Contact types |
| createdAt | datetime | Creation timestamp |
| updatedAt | datetime | Last update |
AddressDTO
| Field | Type | Description |
|---|---|---|
| street | string | Street name |
| streetNumber | string | House number |
| supplemental | string | Address supplement |
| zipCode | string | Postal code |
| city | string | City |
| country | string | Country (ISO code, e.g. DE) |
| type | string | Address type (e.g. MAIN, BILLING) |
Slug
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | — | MongoDB ObjectId |
| slug | string | URL subroute of the shop | |
| label | string | — | Readable name |
| collection | string | MongoDB collection | |
| objectType | string | "product" or "product-list" | |
| refId | string | — | Product reference (for product) |
| fields | object | — | Filter for product-list |
| context | string[] | — | Display contexts |
| defaultSort | SortField[] | — | Default sorting |
| inactive | boolean | — | Deactivates the slug |
ProductDataDTO
| Field | Type | Description |
|---|---|---|
| base | object | Base product data (dynamic, shop-specific) |
| additional | object | Extensible additional fields |
RelationDeltaDTO
Used by PATCH endpoints to manage relations (people↔organizations).
| Field | Type | Description |
|---|---|---|
| add | string[] | IDs to be added |
| remove | string[] | IDs to be removed |
Wiresphere API · OpenAPI 3.0.1 · Documentation generated May 2026
Base URL: https://api.wiresphere.com · Authentication: Bearer JWT · Token validity: 24 hours