Download OpenAPI specification:
Sales system of ACME analog Inc. and system of record for customers & resellers, products, price lists, quotes and orders (production contracts).
Orders are confirmed via the e-approval system: above defined thresholds an authorized signatory must approve (resolved via ACMEhr — approval limits/deputies). Confirmed orders (products, quantities, delivery dates) drive factory, port and treasury.
Pipeline (sales overlay). /pipeline is a sales-facing projection of the deal lifecycle across leads, quotes and orders onto five ordered stages (NEU · QUALIFIZIERT · ANGEBOT · VERHANDLUNG · GEWONNEN). A Deal may be a bare lead or linked to its backing quote/order as it progresses; probability is derived from stage. The overlay carries sales attributes the transactional models don't (assigned owner, contact, stage), so PATCH /pipeline/{id} can set the stage directly (for board drag-drop / inline edit) while the transactional endpoints remain the source of truth for quotes and orders. Read model — see each operation for the status→stage derivation.
Contacts & mail. A Customer is the company (system of record); /contacts are the people at a customer (a contact may be linked to one customer). A Deal references both its customerId and the contactId it is with, so a company/contact detail view can list its opportunities (/pipeline?customerId=…/?contactId=…) alongside its correspondence (/threads?customerId=…/?contactId=…). Mail threads are a lightweight overlay for the CRM UI; a real mail-sync backend is future work (currently mocked, like /pipeline).
Web forms & newsletter. /forms are lead-capture forms / newsletter signups. Their layout (fields, required flags) and the actions a valid submission triggers (send email · create contact/opportunity · schedule appointment · newsletter subscribe/unsubscribe) are maintained in the Admin area. POST /forms/{id}/submit is the public (unauthenticated) submission tool: it validates the required fields, stores the submission on success and runs the configured actions. Captured submissions are readable by CRM users via /forms/{id}/submissions.
Roles (ACMEbase): WATCH reads, WORK writes operationally (quotes/orders/approval), ADMIN maintains master data (products/price lists). Per operation under x-required-role; hierarchy ADMIN > WORK > WATCH.
| kind | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
| resellerId | string Customers of a reseller. |
| q | string |
| id required | string |
| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status required | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string or null <email> | |
| country | string or null |
| parentResellerId | string or null For end customers of a reseller. |
| priceListId | string or null Assigned price list. |
[- {
- "id": "string",
- "name": "Kontor Nord GmbH",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "DE",
- "parentResellerId": "string",
- "priceListId": "string"
}
]| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string <email> | |
| country | string |
| parentResellerId | string or null |
| priceListId | string or null |
| id required | string |
| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status required | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string or null <email> | |
| country | string or null |
| parentResellerId | string or null For end customers of a reseller. |
| priceListId | string or null Assigned price list. |
{- "name": "string",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "string",
- "parentResellerId": "string",
- "priceListId": "string"
}{- "id": "string",
- "name": "Kontor Nord GmbH",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "DE",
- "parentResellerId": "string",
- "priceListId": "string"
}| id required | string |
| id required | string |
| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status required | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string or null <email> | |
| country | string or null |
| parentResellerId | string or null For end customers of a reseller. |
| priceListId | string or null Assigned price list. |
{- "id": "string",
- "name": "Kontor Nord GmbH",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "DE",
- "parentResellerId": "string",
- "priceListId": "string"
}| id required | string |
| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string <email> | |
| country | string |
| parentResellerId | string or null |
| priceListId | string or null |
| id required | string |
| name required | string |
| kind required | string (CustomerKind) Enum: "CUSTOMER" "RESELLER" |
| status required | string (CustomerStatus) Enum: "PROSPECT" "ACTIVE" "BLOCKED" |
string or null <email> | |
| country | string or null |
| parentResellerId | string or null For end customers of a reseller. |
| priceListId | string or null Assigned price list. |
{- "name": "string",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "string",
- "parentResellerId": "string",
- "priceListId": "string"
}{- "id": "string",
- "name": "Kontor Nord GmbH",
- "kind": "CUSTOMER",
- "status": "PROSPECT",
- "email": "user@example.com",
- "country": "DE",
- "parentResellerId": "string",
- "priceListId": "string"
}| category | string |
| active | boolean |
| q | string |
| id required | string |
| sku required | string |
| name required | string |
| category | string or null |
| unit | string Default: "piece" |
| active required | boolean |
object (Money) Monetary amount. |
[- {
- "id": "string",
- "sku": "ACME-RADIO-01",
- "name": "Tube radio „Nostalgie“",
- "category": "string",
- "unit": "piece",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}
]| sku required | string |
| name required | string |
| category | string |
| unit | string |
| active | boolean |
object (Money) Monetary amount. |
| id required | string |
| sku required | string |
| name required | string |
| category | string or null |
| unit | string Default: "piece" |
| active required | boolean |
object (Money) Monetary amount. |
{- "sku": "string",
- "name": "string",
- "category": "string",
- "unit": "string",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}{- "id": "string",
- "sku": "ACME-RADIO-01",
- "name": "Tube radio „Nostalgie“",
- "category": "string",
- "unit": "piece",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}| id required | string |
| id required | string |
| sku required | string |
| name required | string |
| category | string or null |
| unit | string Default: "piece" |
| active required | boolean |
object (Money) Monetary amount. |
{- "id": "string",
- "sku": "ACME-RADIO-01",
- "name": "Tube radio „Nostalgie“",
- "category": "string",
- "unit": "piece",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}| id required | string |
| sku required | string |
| name required | string |
| category | string |
| unit | string |
| active | boolean |
object (Money) Monetary amount. |
| id required | string |
| sku required | string |
| name required | string |
| category | string or null |
| unit | string Default: "piece" |
| active required | boolean |
object (Money) Monetary amount. |
{- "sku": "string",
- "name": "string",
- "category": "string",
- "unit": "string",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}{- "id": "string",
- "sku": "ACME-RADIO-01",
- "name": "Tube radio „Nostalgie“",
- "category": "string",
- "unit": "piece",
- "active": true,
- "listPrice": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}
}| kind | string (PriceListKind) Enum: "LIST" "RESELLER" "CUSTOM" |
| id required | string |
| name required | string |
| currency required | string = 3 characters |
| kind required | string (PriceListKind) Enum: "LIST" "RESELLER" "CUSTOM" |
object (DateRange) Validity period. | |
required | Array of objects (PriceListItem) |
[- {
- "id": "string",
- "name": "string",
- "currency": "EUR",
- "kind": "LIST",
- "validity": {
- "from": "2019-08-24",
- "until": "2019-08-24"
}, - "items": [
- {
- "productId": "string",
- "unitPrice": 149,
- "minQuantity": 1
}
]
}
]| name required | string |
| currency required | string = 3 characters |
| kind required | string (PriceListKind) Enum: "LIST" "RESELLER" "CUSTOM" |
| validFrom | string <date> |
| validUntil | string or null <date> |
Array of objects (PriceListItem) |
| id required | string |
| name required | string |
| currency required | string = 3 characters |
| kind required | string (PriceListKind) Enum: "LIST" "RESELLER" "CUSTOM" |
object (DateRange) Validity period. | |
required | Array of objects (PriceListItem) |
{- "name": "string",
- "currency": "str",
- "kind": "LIST",
- "validFrom": "2019-08-24",
- "validUntil": "2019-08-24",
- "items": [
- {
- "productId": "string",
- "unitPrice": 149,
- "minQuantity": 1
}
]
}{- "id": "string",
- "name": "string",
- "currency": "EUR",
- "kind": "LIST",
- "validity": {
- "from": "2019-08-24",
- "until": "2019-08-24"
}, - "items": [
- {
- "productId": "string",
- "unitPrice": 149,
- "minQuantity": 1
}
]
}| id required | string |
| id required | string |
| name required | string |
| currency required | string = 3 characters |
| kind required | string (PriceListKind) Enum: "LIST" "RESELLER" "CUSTOM" |
object (DateRange) Validity period. | |
required | Array of objects (PriceListItem) |
{- "id": "string",
- "name": "string",
- "currency": "EUR",
- "kind": "LIST",
- "validity": {
- "from": "2019-08-24",
- "until": "2019-08-24"
}, - "items": [
- {
- "productId": "string",
- "unitPrice": 149,
- "minQuantity": 1
}
]
}Returns the unit price applicable for customer + product + quantity (incl. tier/reseller).
| customerId required | string |
| productId required | string |
| quantity | integer >= 1 Default: 1 |
| productId required | string |
| customerId required | string |
| quantity required | integer |
| unitPrice required | number |
| currency | string |
| priceListId | string or null |
| source | string Enum: "PRICE_LIST" "LIST_PRICE" |
{- "productId": "string",
- "customerId": "string",
- "quantity": 0,
- "unitPrice": 0,
- "currency": "string",
- "priceListId": "string",
- "source": "PRICE_LIST"
}| customerId | string |
| status | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| id required | string |
| customerId required | string |
| customerName | string |
| status required | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| currency required | string |
| validUntil | string or null <date> |
required | Array of objects (Line) |
| netTotal required | number |
| createdOn | string or null <date> |
[- {
- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "status": "DRAFT",
- "currency": "string",
- "validUntil": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "netTotal": 0,
- "createdOn": "2019-08-24"
}
]Unit prices are resolved from the customer's price list if not provided.
| customerId required | string |
| validUntil | string or null <date> |
required | Array of objects (LineWrite) non-empty |
| id required | string |
| customerId required | string |
| customerName | string |
| status required | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| currency required | string |
| validUntil | string or null <date> |
required | Array of objects (Line) |
| netTotal required | number |
| createdOn | string or null <date> |
{- "customerId": "string",
- "validUntil": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "quantity": 1,
- "unitPrice": 0,
- "discountPercent": 0
}
]
}{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "status": "DRAFT",
- "currency": "string",
- "validUntil": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "netTotal": 0,
- "createdOn": "2019-08-24"
}| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| status required | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| currency required | string |
| validUntil | string or null <date> |
required | Array of objects (Line) |
| netTotal required | number |
| createdOn | string or null <date> |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "status": "DRAFT",
- "currency": "string",
- "validUntil": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "netTotal": 0,
- "createdOn": "2019-08-24"
}| id required | string |
| status | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| validUntil | string or null <date> |
| id required | string |
| customerId required | string |
| customerName | string |
| status required | string (QuoteStatus) Enum: "DRAFT" "SENT" "ACCEPTED" "REJECTED" "EXPIRED" |
| currency required | string |
| validUntil | string or null <date> |
required | Array of objects (Line) |
| netTotal required | number |
| createdOn | string or null <date> |
{- "status": "DRAFT",
- "validUntil": "2019-08-24"
}{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "status": "DRAFT",
- "currency": "string",
- "validUntil": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "netTotal": 0,
- "createdOn": "2019-08-24"
}Marks the quote as accepted and creates an order from it.
| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}Consumers read the approved orders via status=APPROVED for the production cycle.
| customerId | string |
| status | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
[- {
- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}
]| customerId required | string |
| quoteId | string or null |
required | Array of objects (LineWrite) non-empty |
| shippingMode | string or null |
| note | string or null |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "customerId": "string",
- "quoteId": "string",
- "lines": [
- {
- "productId": "string",
- "quantity": 1,
- "unitPrice": 0,
- "discountPercent": 0
}
], - "shippingMode": "string",
- "note": "string"
}{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}Destructive reset of the order stock — intended only for the data/economy reset, hence ADMIN. Not for normal operation.
{- "title": "string",
- "status": 0,
- "detail": "string",
- "instance": "string"
}| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}Sets the status to PENDING_APPROVAL or — below the threshold — directly to APPROVED.
| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}| id required | string |
| approverId required | string Person (ACMEhr) making the decision. |
| decision required | string Enum: "APPROVE" "REJECT" |
| comment | string or null |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "approverId": "string",
- "decision": "APPROVE",
- "comment": "string"
}{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}Reports the quantities produced on a day per line; reduces remainingQuantity. The production cycle calls this after manufacturing. Once the order is thereby complete, it moves to FULFILLED.
| id required | string |
required | Array of objects non-empty |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "lines": [
- {
- "productId": "string",
- "producedQuantity": 0
}
]
}{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}| id required | string |
| id required | string |
| customerId required | string |
| customerName | string |
| customerCountry | string or null |
| quoteId | string or null |
| status required | string (OrderStatus) Enum: "CREATED" "PENDING_APPROVAL" "APPROVED" "REJECTED" "FULFILLED" "CANCELLED" |
| orderDate required | string <date> |
required | Array of objects (Line) |
required | object (Money) Monetary amount. |
object (Approval) E-approval status of an order/procurement. | |
| shippingMode | string or null Shipping mode (e.g. AIR = air freight, otherwise sea freight). |
| note | string or null |
{- "id": "string",
- "customerId": "string",
- "customerName": "string",
- "customerCountry": "string",
- "quoteId": "string",
- "status": "CREATED",
- "orderDate": "2019-08-24",
- "lines": [
- {
- "productId": "string",
- "productName": "string",
- "quantity": 0,
- "unitPrice": 0,
- "discountPercent": 0,
- "lineTotal": 0,
- "remainingQuantity": 0
}
], - "total": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "approval": {
- "required": true,
- "approverId": "string",
- "decision": "APPROVE",
- "decidedOn": "2019-08-24",
- "comment": "string"
}, - "shippingMode": "string",
- "note": "string"
}| customerId | string Contacts of a customer. |
| q | string |
| id required | string |
| customerId | string or null The company this contact belongs to. |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean Default: false Primary contact of the customer. |
| newsletter | boolean Default: false Newsletter opt-in (set by form newsletter actions). |
[- {
- "id": "contact-1001",
- "customerId": "string",
- "name": "Sara Mena",
- "role": "CTO",
- "email": "user@example.com",
- "phone": "string",
- "primary": false,
- "newsletter": false
}
]| customerId | string or null |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean |
| newsletter | boolean |
| id required | string |
| customerId | string or null The company this contact belongs to. |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean Default: false Primary contact of the customer. |
| newsletter | boolean Default: false Newsletter opt-in (set by form newsletter actions). |
{- "customerId": "string",
- "name": "string",
- "role": "string",
- "email": "user@example.com",
- "phone": "string",
- "primary": true,
- "newsletter": true
}{- "id": "contact-1001",
- "customerId": "string",
- "name": "Sara Mena",
- "role": "CTO",
- "email": "user@example.com",
- "phone": "string",
- "primary": false,
- "newsletter": false
}| id required | string |
| id required | string |
| customerId | string or null The company this contact belongs to. |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean Default: false Primary contact of the customer. |
| newsletter | boolean Default: false Newsletter opt-in (set by form newsletter actions). |
{- "id": "contact-1001",
- "customerId": "string",
- "name": "Sara Mena",
- "role": "CTO",
- "email": "user@example.com",
- "phone": "string",
- "primary": false,
- "newsletter": false
}| id required | string |
| customerId | string or null |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean |
| newsletter | boolean |
| id required | string |
| customerId | string or null The company this contact belongs to. |
| name required | string |
| role | string or null |
string or null <email> | |
| phone | string or null |
| primary | boolean Default: false Primary contact of the customer. |
| newsletter | boolean Default: false Newsletter opt-in (set by form newsletter actions). |
{- "customerId": "string",
- "name": "string",
- "role": "string",
- "email": "user@example.com",
- "phone": "string",
- "primary": true,
- "newsletter": true
}{- "id": "contact-1001",
- "customerId": "string",
- "name": "Sara Mena",
- "role": "CTO",
- "email": "user@example.com",
- "phone": "string",
- "primary": false,
- "newsletter": false
}Sales pipeline overlay — a stage projection over leads/quotes/orders for the CRM board, table and funnel. Read-mostly; stage is settable for drag-drop / inline edit.
The sales pipeline as a list of Deals, each projected onto one of five stages.
Status → stage derivation (for deals backed by a quote/order): quote DRAFT → NEU; quote SENT → QUALIFIZIERT; quote ACCEPTED or order CREATED → ANGEBOT; order PENDING_APPROVAL → VERHANDLUNG; order APPROVED or FULFILLED → GEWONNEN. Lost deals (quote REJECTED/EXPIRED, order REJECTED/CANCELLED) are excluded by default. Bare leads (no quote yet) sit in the stage last set on them (default NEU).
| stage | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| owner | string Filter by owner initials. |
| customerId | string Deals of a customer. |
| contactId | string Deals with a contact. |
| q | string Free-text over company/contact. |
| id required | string |
| source required | string (DealSource) Enum: "LEAD" "QUOTE" "ORDER" What the deal is currently backed by in the transactional model. |
| quoteId | string or null |
| orderId | string or null |
| customerId | string or null |
| contactId | string or null The contact this deal is with. |
| company required | string |
| contact | string or null |
| stage required | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| probability required | integer [ 0 .. 100 ] Derived from |
required | object (Money) Monetary amount. |
object (Owner) Sales owner assigned to a deal (avatar initials + display name). | |
| lastActivity | string or null Human label |
| lastActivityAt | string or null <date-time> |
| ageDays | integer or null Days since the deal entered its current stage. |
[- {
- "id": "deal-1024",
- "source": "LEAD",
- "quoteId": "string",
- "orderId": "string",
- "customerId": "string",
- "contactId": "string",
- "company": "Nordwind Logistik",
- "contact": "Michael Braun · CPO",
- "stage": "NEU",
- "probability": 100,
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "owner": {
- "initials": "JS",
- "name": "Jana Schmidt"
}, - "lastActivity": "string",
- "lastActivityAt": "2019-08-24T14:15:22Z",
- "ageDays": 0
}
]Adds a new deal to the pipeline. Without a customerId/backing quote it is a bare lead (enters NEU by default); the sales team later attaches a quote/order as it progresses.
| company required | string |
| contact | string or null |
| customerId | string or null |
| contactId | string or null |
| stage | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
object (Money) Monetary amount. | |
| ownerInitials | string or null |
| id required | string |
| source required | string (DealSource) Enum: "LEAD" "QUOTE" "ORDER" What the deal is currently backed by in the transactional model. |
| quoteId | string or null |
| orderId | string or null |
| customerId | string or null |
| contactId | string or null The contact this deal is with. |
| company required | string |
| contact | string or null |
| stage required | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| probability required | integer [ 0 .. 100 ] Derived from |
required | object (Money) Monetary amount. |
object (Owner) Sales owner assigned to a deal (avatar initials + display name). | |
| lastActivity | string or null Human label |
| lastActivityAt | string or null <date-time> |
| ageDays | integer or null Days since the deal entered its current stage. |
{- "company": "string",
- "contact": "string",
- "customerId": "string",
- "contactId": "string",
- "stage": "NEU",
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "ownerInitials": "string"
}{- "id": "deal-1024",
- "source": "LEAD",
- "quoteId": "string",
- "orderId": "string",
- "customerId": "string",
- "contactId": "string",
- "company": "Nordwind Logistik",
- "contact": "Michael Braun · CPO",
- "stage": "NEU",
- "probability": 100,
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "owner": {
- "initials": "JS",
- "name": "Jana Schmidt"
}, - "lastActivity": "string",
- "lastActivityAt": "2019-08-24T14:15:22Z",
- "ageDays": 0
}| id required | string |
| id required | string |
| source required | string (DealSource) Enum: "LEAD" "QUOTE" "ORDER" What the deal is currently backed by in the transactional model. |
| quoteId | string or null |
| orderId | string or null |
| customerId | string or null |
| contactId | string or null The contact this deal is with. |
| company required | string |
| contact | string or null |
| stage required | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| probability required | integer [ 0 .. 100 ] Derived from |
required | object (Money) Monetary amount. |
object (Owner) Sales owner assigned to a deal (avatar initials + display name). | |
| lastActivity | string or null Human label |
| lastActivityAt | string or null <date-time> |
| ageDays | integer or null Days since the deal entered its current stage. |
{- "id": "deal-1024",
- "source": "LEAD",
- "quoteId": "string",
- "orderId": "string",
- "customerId": "string",
- "contactId": "string",
- "company": "Nordwind Logistik",
- "contact": "Michael Braun · CPO",
- "stage": "NEU",
- "probability": 100,
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "owner": {
- "initials": "JS",
- "name": "Jana Schmidt"
}, - "lastActivity": "string",
- "lastActivityAt": "2019-08-24T14:15:22Z",
- "ageDays": 0
}Sets sales-overlay attributes. Moving stage reflects the board drag-drop / inline edit; where a deal is backed by a quote/order the server advances the underlying record along its legal transition, otherwise it records the stage on the overlay.
| id required | string |
| stage | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| company | string |
| contact | string or null |
| contactId | string or null |
object (Money) Monetary amount. | |
| ownerInitials | string or null |
| id required | string |
| source required | string (DealSource) Enum: "LEAD" "QUOTE" "ORDER" What the deal is currently backed by in the transactional model. |
| quoteId | string or null |
| orderId | string or null |
| customerId | string or null |
| contactId | string or null The contact this deal is with. |
| company required | string |
| contact | string or null |
| stage required | string (PipelineStage) Enum: "NEU" "QUALIFIZIERT" "ANGEBOT" "VERHANDLUNG" "GEWONNEN" Ordered sales stage. |
| probability required | integer [ 0 .. 100 ] Derived from |
required | object (Money) Monetary amount. |
object (Owner) Sales owner assigned to a deal (avatar initials + display name). | |
| lastActivity | string or null Human label |
| lastActivityAt | string or null <date-time> |
| ageDays | integer or null Days since the deal entered its current stage. |
{- "stage": "NEU",
- "company": "string",
- "contact": "string",
- "contactId": "string",
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "ownerInitials": "string"
}{- "id": "deal-1024",
- "source": "LEAD",
- "quoteId": "string",
- "orderId": "string",
- "customerId": "string",
- "contactId": "string",
- "company": "Nordwind Logistik",
- "contact": "Michael Braun · CPO",
- "stage": "NEU",
- "probability": 100,
- "value": {
- "amount": 50000,
- "currency": "EUR",
- "unlimited": false
}, - "owner": {
- "initials": "JS",
- "name": "Jana Schmidt"
}, - "lastActivity": "string",
- "lastActivityAt": "2019-08-24T14:15:22Z",
- "ageDays": 0
}Mail threads (correspondence) attached to a customer/contact. UI overlay — a real mail-sync backend is future work (currently mocked).
Correspondence attached to a customer and/or contact. Filter by either.
| customerId | string |
| contactId | string |
| q | string |
| id required | string |
| subject required | string |
| customerId | string or null |
| contactId | string or null |
| participants | Array of strings |
| messageCount | integer |
| lastMessageAt | string or null <date-time> |
| preview | string or null Snippet of the latest message. |
Array of objects (MailMessage) |
[- {
- "id": "thread-1001",
- "subject": "Angebot Rahmen XL",
- "customerId": "string",
- "contactId": "string",
- "participants": [
- "string"
], - "messageCount": 0,
- "lastMessageAt": "2019-08-24T14:15:22Z",
- "preview": "string",
- "messages": [
- {
- "id": "string",
- "direction": "INBOUND",
- "from": "string",
- "to": "string",
- "sentAt": "2019-08-24T14:15:22Z",
- "snippet": "string",
- "body": "string"
}
]
}
]| id required | string |
| id required | string |
| subject required | string |
| customerId | string or null |
| contactId | string or null |
| participants | Array of strings |
| messageCount | integer |
| lastMessageAt | string or null <date-time> |
| preview | string or null Snippet of the latest message. |
Array of objects (MailMessage) |
{- "id": "thread-1001",
- "subject": "Angebot Rahmen XL",
- "customerId": "string",
- "contactId": "string",
- "participants": [
- "string"
], - "messageCount": 0,
- "lastMessageAt": "2019-08-24T14:15:22Z",
- "preview": "string",
- "messages": [
- {
- "id": "string",
- "direction": "INBOUND",
- "from": "string",
- "to": "string",
- "sentAt": "2019-08-24T14:15:22Z",
- "snippet": "string",
- "body": "string"
}
]
}Web forms / newsletter signups. Layout and trigger actions are configured in Admin; POST /forms/{id}/submit is the public submission tool (validate → store → trigger).
Configured web forms / newsletter signups (definition maintained in Admin).
| id required | string |
| name required | string |
| slug required | string Public identifier used to embed the form. |
| description | string or null |
| enabled | boolean Default: true |
required | Array of objects (FormField) |
Array of objects (FormAction) Triggered on a valid submission. | |
| createdOn | string or null <date> |
[- {
- "id": "form-lead",
- "name": "Kontaktformular",
- "slug": "kontakt",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
], - "createdOn": "2019-08-24"
}
]| name required | string |
| slug required | string |
| description | string or null |
| enabled | boolean |
required | Array of objects (FormField) |
Array of objects (FormAction) |
| id required | string |
| name required | string |
| slug required | string Public identifier used to embed the form. |
| description | string or null |
| enabled | boolean Default: true |
required | Array of objects (FormField) |
Array of objects (FormAction) Triggered on a valid submission. | |
| createdOn | string or null <date> |
{- "name": "string",
- "slug": "string",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
]
}{- "id": "form-lead",
- "name": "Kontaktformular",
- "slug": "kontakt",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
], - "createdOn": "2019-08-24"
}| id required | string |
| id required | string |
| name required | string |
| slug required | string Public identifier used to embed the form. |
| description | string or null |
| enabled | boolean Default: true |
required | Array of objects (FormField) |
Array of objects (FormAction) Triggered on a valid submission. | |
| createdOn | string or null <date> |
{- "id": "form-lead",
- "name": "Kontaktformular",
- "slug": "kontakt",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
], - "createdOn": "2019-08-24"
}| id required | string |
| name required | string |
| slug required | string |
| description | string or null |
| enabled | boolean |
required | Array of objects (FormField) |
Array of objects (FormAction) |
| id required | string |
| name required | string |
| slug required | string Public identifier used to embed the form. |
| description | string or null |
| enabled | boolean Default: true |
required | Array of objects (FormField) |
Array of objects (FormAction) Triggered on a valid submission. | |
| createdOn | string or null <date> |
{- "name": "string",
- "slug": "string",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
]
}{- "id": "form-lead",
- "name": "Kontaktformular",
- "slug": "kontakt",
- "description": "string",
- "enabled": true,
- "fields": [
- {
- "key": "email",
- "label": "E-Mail",
- "type": "TEXT",
- "required": false,
- "placeholder": "string",
- "options": [
- "string"
]
}
], - "actions": [
- {
- "type": "SEND_EMAIL",
- "config": { }
}
], - "createdOn": "2019-08-24"
}Public submission tool for the embedded web form / newsletter signup — no auth (overrides the global bearer security). Validates the submitted values against the form's required fields (422 listing the offending fields on failure); on success stores the submission and runs the configured trigger actions (send email, create contact/opportunity, schedule appointment, newsletter subscribe/unsubscribe). Returns the stored submission incl. which actions were triggered.
| id required | string |
required | object |
| id required | string |
| formId required | string |
required | object |
| submittedAt required | string <date-time> |
Array of objects (TriggeredAction) |
{- "values": {
- "name": "Sara Mena",
- "email": "sara@example.com",
- "newsletter": true
}
}{- "id": "string",
- "formId": "string",
- "values": { },
- "submittedAt": "2019-08-24T14:15:22Z",
- "triggered": [
- {
- "type": "SEND_EMAIL",
- "status": "DONE",
- "detail": "string",
- "ref": "string"
}
]
}| id required | string |
| id required | string |
| formId required | string |
required | object |
| submittedAt required | string <date-time> |
Array of objects (TriggeredAction) |
[- {
- "id": "string",
- "formId": "string",
- "values": { },
- "submittedAt": "2019-08-24T14:15:22Z",
- "triggered": [
- {
- "type": "SEND_EMAIL",
- "status": "DONE",
- "detail": "string",
- "ref": "string"
}
]
}
]