Download OpenAPI specification:
Please note: this documentation may be updated or changed. Do you have suggestions or additions? Please let us know at [email protected].
Issues an access token using either the client_credentials or refresh_token grant type. This endpoint does not require authentication.
| grant_type required | string |
| client_id required | string non-empty |
| client_secret required | string non-empty |
| access_token required | string |
| token_type required | string |
| expires_in required | integer <int32> |
| refresh_token | string or null |
{- "grant_type": "client_credentials",
- "client_id": "my-client-id",
- "client_secret": "my-client-secret"
}{- "access_token": "string",
- "token_type": "Bearer",
- "expires_in": 3600,
- "refresh_token": "string"
}Returns the authenticated customer's profile.
required | object (customer_profile) |
{- "customer": {
- "id": "018f3c3a-4a5e-73b3-a8d3-b1e2f3a4b5c6",
- "defaultBillingAddressId": "018f3c3a-4a5e-73b3-a8d3-b1e2f3a4b5c7",
- "defaultShippingAddressId": "018f3c3a-4a5e-73b3-a8d3-b1e2f3a4b5c8",
- "customerNumber": "C000123",
- "firstName": "Jane",
- "lastName": "Doe",
- "company": "Acme BV",
- "active": true,
- "createdAt": "2026-02-24T09:39:26+00:00",
- "updatedAt": "2026-02-24T09:39:26+00:00",
- "lastLogin": "2026-02-24T09:39:26+00:00",
- "addresses": [
- {
- "id": "018f3c3a-4a5e-73b3-a8d3-b1e2f3a4b5d0",
- "firstName": "Jane",
- "lastName": "Doe",
- "company": "Acme BV",
- "title": "Ms",
- "street": "Main street 1",
- "additionalAddressLine1": null,
- "additionalAddressLine2": null,
- "city": "Torhout",
- "zipCode": "8820",
- "country": {
- "id": "018f3c3a-4a5e-73b3-a8d3-b1e2f3a4b5e0",
- "name": "Belgium",
- "iso": "BE"
}, - "phoneNumber": "+3250123456",
- "createdAt": "2026-02-24T09:39:26+00:00",
- "updatedAt": "2026-02-24T09:39:26+00:00"
}
]
}
}Use GET /assortment to retrieve the product numbers available to you. Then retrieve the PLC status and the assortment type of these products via GET /products. Both are returned in the details object of each product.
The field details.plcStatus indicates the lifecycle status of a product. The value is returned in the language of the request (parameter language). Example for nl: "Actief".
The field details.assortmentType mainly applies to products with a certification, such as FSC or PEFC. The value is returned in the language of the request (parameter language). Example for nl: "Primair assortiment".
Tuindeco does not always have the same certification in stock: one batch of a product may be FSC certified, while the next batch is PEFC certified. For this reason, one variant is marked as Primary assortment and the other variants as Substitute assortment.
Example: the FSC version of a product is the Primary assortment and the PEFC version is the Substitute assortment. The FSC version can always be ordered. The PEFC version can also be ordered, but only when its PLC status is Active and it is in stock.
Returns a paginated list of product numbers that belong to the customer's assortment.
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
required | object (_meta) Standard pagination metadata |
| results required | Array of strings |
{- "_meta": {
- "currentPage": 1,
- "hasMore": true,
- "limit": 50,
- "total": 123
}, - "results": [
- "SW-10001",
- "SW-10002"
]
}Returns a paginated list of product configurators in the customer's assortment.
| productIds required | string non-empty Example: productIds=e1aad7c3052a443bb1c0e081fffb9dd5,fc6d36cca5fd46738d76e82509525148 Comma-separated list of product IDs. Example: "e1aad7c3052a443bb1c0e081fffb9dd5,fc6d36cca5fd46738d76e82509525148" |
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
required | object (_meta) Standard pagination metadata |
required | Array of objects (product_configurator) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": true,
- "limit": 100,
- "total": 100
}, - "results": [
- {
- "id": "005d0d89aecb569294fbbc64bb392710",
- "name": "Configurator - Blokhut - Tuinhuis Kwaspa | 44 mm | vuren groen geïmpregneerd",
- "steps": [
- {
- "id": "b7d4d1dea3715aa7815be7d72255fcc7",
- "name": "Dakbedekking",
- "description": "Kies de dakbedekking voor uw buitenverblijf.",
- "position": 1,
- "isRequired": false,
- "multipleItemsAllowed": false,
- "minItemsRequired": 1,
- "items": [
- {
- "id": "072ac2b7cf0dbae5b3df3455b90a1549",
- "type": "product",
- "product": {
- "id": "db5b53faa9c353e6bef21ef7909b24bb",
- "name": "Easy-pan rood, Kwaspa",
- "productNumber": "P065892",
- "image": {
- "alt": "Hoofdafbeelding"
}
}, - "variants": [ ],
- "quantity": 1,
- "position": 0,
- "substep": null,
- "extraInformation": null,
- "requiresStepId": null,
- "requiresProductId": null
}
]
}
]
}
]
}Returns a paginated list of products in the customer's assortment. Optionally filter by productNumbers (comma-separated).
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
| productNumbers required | string non-empty Example: productNumbers=SW-10001,SW-10002 Comma-separated list of product numbers. Example: "SW-10001,SW-10002" |
required | object (_meta) Standard pagination metadata |
required | Array of objects (product) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": true,
- "limit": 100,
- "total": 1234
}, - "results": [
- {
- "id": "9fa46d2b645d5d609bc2706bd59877e5",
- "parent": null,
- "name": "Kiosk Dancer | 16mm | vuren groen geïmpregneerd | 300 x 200 cm | incl. vloer",
- "description": null,
- "internalSku": "13025",
- "productNumber": "P013025",
- "ean": "8715815545029",
- "menu": {
- "group1": "Buitenverblijven",
- "group2": "Kiosken"
}, - "purchaseSteps": 1,
- "images": [
- {
- "title": "Hoofdafbeelding"
},
], - "details": {
- "colourFamily": "groen",
- "material": "zachthout",
- "erpStocktype": "Op voorraad",
- "colour": "groen",
- "includedRoofCovering": "dakleer",
- "assortmentType": "Primair assortiment",
- "included": "fundering",
- "plcStatus": "Actief",
- "materialDetailed": "vuren",
- "treatment": "geïmpregneerd",
- "typeRoof": "zadeldak",
- "sku": "40.0136",
- "erpCe": false,
- "erpKomo": false,
- "erpName": "Kiosk Dancer | 16mm | vuren groen geïmpregneerd | 300 x 200 cm | incl. vloer",
- "contentM3": "13 m³",
- "foundation": "299 x 197 cm",
- "newProduct": false,
- "numberHatch": 1,
- "prefabPanel": true,
- "dimensionsPub": "300 x 200 cm",
- "erpSalesWidth": "1970 mm",
- "stockThreshold": 15,
- "erpSalesHeight": "2490 mm",
- "erpSalesLength": "2990 mm",
- "roofSurfaceArea": "7.6 m²",
- "erpAtpLeadtime": 4
}, - "measurements": {
- "weight": 580,
- "width": 1000,
- "height": 590,
- "length": 1950
}, - "configuratorId": "9fa46d2b645d5d609bc2706bd59877e5"
}
]
}Returns a paginated list of product models in the customer's assortment. Optionally filter by productNumbers (comma-separated).
A product model is a product family: a group of related products that are offered as variants of one product, for example in a different colour or treatment. Product models are independent of the assortment type (Primary or Substitute assortment).
| productNumbers required | string non-empty Example: productNumbers=SW-10001,SW-10002 Comma-separated list of product numbers. Example: "SW-10001,SW-10002" |
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
required | object (_meta) Standard pagination metadata |
| results required | Array of any (product_model) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": true,
- "limit": 100,
- "total": 1792
}, - "results": [
- {
- "id": "033d85764f17539098a9dc4a75b9bb2d",
- "productNumber": "Grpitm_tdi_v01_gardenscreen_dronten",
- "variants": [
- {
- "id": "22fc6e671fe450f6a71e01bf278b2109",
- "productNumber": "P002245",
- "internalSku": "2245"
}, - {
- "id": "25a9cf1140fc55bd82ecfc6679c4a7aa",
- "productNumber": "P002243",
- "internalSku": "2243"
}
]
}
]
}Returns a paginated stock mapping for the given comma-separated productNumbers. Only products in the customer's assortment are considered.
Stock threshold: for some products the Tuindeco purchasing department has set a stock threshold (see the product field details.stockThreshold). If the stock is equal to or higher than that threshold, stock contains the threshold value and the threshold field is included. Recommended display: show "more than [threshold]" instead of an exact quantity. If the threshold field is absent, stock is the exact stock level.
| productNumbers required | string non-empty Example: productNumbers=SW-10001,SW-10002 Comma-separated list of product numbers. Example: "SW-10001,SW-10002" |
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
required | object (_meta) Standard pagination metadata |
required | object Map of productNumber to stock info (stock is optionally capped by threshold) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": false,
- "limit": 100,
- "total": 3
}, - "results": {
- "SW-10001": {
- "stock": 12
}, - "SW-10002": {
- "stock": 0
}, - "SW-10003": {
- "stock": 15,
- "threshold": 15
}
}
}Returns price information for the given comma-separated productNumbers. Only products in the customer's assortment are considered.
| productNumbers required | string non-empty Example: productNumbers=SW-10001,SW-10002 Comma-separated list of product numbers. Example: "SW-10001,SW-10002" |
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
required | object (_meta) Standard pagination metadata |
required | Array of objects (price_result) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": false,
- "limit": 50,
- "total": 2
}, - "results": [
- {
- "productNumber": "SW-10001",
- "minQuantity": 1,
- "unitPrice": 12.34,
- "consumerPrices": {
- "BE": 14.99,
- "NL": 15.49
}
}, - {
- "productNumber": "SW-10002",
- "minQuantity": 5,
- "unitPrice": 9.5,
- "consumerPrices": {
- "BE": 11.95
}
}
]
}Creates an order for the authenticated customer. Note: If a productNumber cannot be resolved, it is added as a cart error internally. This endpoint still returns 201 without a response body.
Ordering rules per assortment type (see the product fields details.assortmentType and details.plcStatus):
required | Array of objects (order_create_line_item) non-empty |
| shippingAddressId | string or null <uuid> Optional shipping address id to override the customer's active shipping address. |
| deliveryWeek | integer >= 1 Optional delivery week number (positive integer). If omitted, the server defaults to the current ISO week. |
| reference | string or null Optional order reference. |
object or null Optional one-time delivery address for dropshipment. When provided the order is shipped to this address instead of the customer's active shipping address. The address is not saved to the customer's address book. |
{- "lineItems": [
- {
- "productNumber": "SW-10001",
- "quantity": 2
}
]
}{- "error": "Invalid request body.",
- "exception": "Expected a non-empty-string at key lineItems.0.productNumber"
}Returns a paginated list of customer orders. Optionally filter by status.
| language | string >= 2 characters Default: "nl" Language code (nl, en, de) |
| page | integer <int32> >= 1 Default: 1 Page number (1-based) |
| limit | integer <int32> <= 100 Default: 100 Page size (maximum 100) |
| status | string (order_status) Enum: "Open" "Done" "Paid" "Paid In Full" "Pending Approval" "Pending Fulfillment" "Partially Fulfilled" "Fulfilled" "Partially Billed" "Billed" "Closed" "Cancelled" "In Progress" "Shipped (partially)" "Paid (partially)" "Shipped" "Pending Billing" "Pending Billing/Partially Fulfilled" Optional order status filter (status key). |
| from | string <date> Example: from=2026-01-01 Start date (inclusive) for filtering orders. |
| to | string <date> Example: to=2026-12-31 End date (inclusive) for filtering orders. |
required | object (_meta) Standard pagination metadata |
required | Array of objects (order) |
{- "_meta": {
- "currentPage": 1,
- "hasMore": true,
- "limit": 50,
- "total": 123
}, - "results": [
- {
- "id": "019b9bf3-ebfc-794e-90a4-40d2e62b7491",
- "orderNumber": "SO-1000123",
- "amountNet": 123.45,
- "orderDate": "2026-02-25",
- "reference": "PO-ACME-7788",
- "status": "open"
}
]
}