Product groups
Base URL: https://api.miridia.io. Read Authentication and Conventions before you call these operations.
| Method | Path | Operation |
|---|---|---|
| GET | /api/v1/products/groups/{groupId} | Get product group |
| PUT | /api/v1/products/groups/{groupId} | Update product group |
| DELETE | /api/v1/products/groups/{groupId} | Delete product group |
| POST | /api/v1/products/{parentProductId}/groups | Create product group |
| POST | /api/v1/products/groups/{groupId}/members | Add member |
| DELETE | /api/v1/products/groups/{groupId}/members/{productId} | Remove member |
Get product group
GET/api/v1/products/groups/{groupId}
Access. Send a bearer token or an API key. The caller needs the Products view permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
groupId | path | string (uuid) | Yes |
Response
200. Returns a SingleResult envelope. The data field is ProductGroupResponse.
curl -X GET "https://api.miridia.io/api/v1/products/groups/{groupId}" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID"{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"primaryProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"externalGroupId": "string",
"members": [
{}
],
"dateCreated": "2026-09-29T08:00:00Z"
},
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Update product group
PUT/api/v1/products/groups/{groupId}
Access. Send a bearer token or an API key. The caller needs the Products modify permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
groupId | path | string (uuid) | Yes |
Request body
Send JSON with the shape UpdateProductGroupCommand.
| Field | Type | Required | Description |
|---|---|---|---|
id | string (uuid) | No | |
name | string | Yes | |
description | string | No | |
optionAxes | string[] | No | |
primaryProductId | string (uuid) | No |
Response
200. Returns a SingleResult envelope. The data field is ProductGroupResponse.
curl -X PUT "https://api.miridia.io/api/v1/products/groups/{groupId}" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"primaryProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}'{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"primaryProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"externalGroupId": "string",
"members": [
{}
],
"dateCreated": "2026-09-29T08:00:00Z"
},
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Delete product group
DELETE/api/v1/products/groups/{groupId}
Access. Send a bearer token or an API key. The caller needs the Products delete permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
groupId | path | string (uuid) | Yes |
Response
200. Returns a SingleResult envelope. The data field is boolean.
curl -X DELETE "https://api.miridia.io/api/v1/products/groups/{groupId}" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID"{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": true,
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Create product group
POST/api/v1/products/{parentProductId}/groups
Access. Send a bearer token or an API key. The caller needs the Products modify permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
parentProductId | path | string (uuid) | Yes |
Request body
Send JSON with the shape CreateProductGroupCommand.
| Field | Type | Required | Description |
|---|---|---|---|
parentProductId | string (uuid) | No | The product the group is spun off from; auto-added as the family primary. Set from the route. |
name | string | Yes | |
description | string | No | |
optionAxes | string[] | No | |
parentOptionValues | map<string, string> | No | Per-axis values for the parent member (e.g. {"Size":"500ml"}). Empty if omitted. |
members | CreateProductGroupMember[] | No |
Response
200. Returns a SingleResult envelope. The data field is ProductGroupResponse.
curl -X POST "https://api.miridia.io/api/v1/products/{parentProductId}/groups" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"parentProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"parentOptionValues": {
"key": "string"
},
"members": [
{
"productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"newProduct": {},
"optionValues": {
"key": "string"
},
"position": 0
}
]
}'{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"primaryProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"externalGroupId": "string",
"members": [
{}
],
"dateCreated": "2026-09-29T08:00:00Z"
},
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Add member
POST/api/v1/products/groups/{groupId}/members
Access. Send a bearer token or an API key. The caller needs the Products modify permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
groupId | path | string (uuid) | Yes |
Request body
Send JSON with the shape AddProductGroupMemberCommand.
| Field | Type | Required | Description |
|---|---|---|---|
groupId | string (uuid) | No | |
productId | string (uuid) | No | |
newProduct | CreateProductRequest | No | |
optionValues | map<string, string> | No | |
position | integer (int32) | No |
Response
200. Returns a SingleResult envelope. The data field is ProductGroupResponse.
curl -X POST "https://api.miridia.io/api/v1/products/groups/{groupId}/members" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"groupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"productId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"newProduct": {
"sku": "string",
"title": "string",
"description": "string",
"body": "string",
"price": {
"subTotal": 0,
"totalPrice": 0,
"totalTax": 0,
"totalDiscount": 0,
"discount": 0,
"discountType": "Percentage",
"taxIncluded": true,
"taxRate": 0,
"taxType": "Sales"
},
"geometry": {
"weight": 0,
"width": 0,
"length": 0,
"height": 0,
"lengthType": "Centimeter",
"weightType": "Kilogram"
},
"productType": "FinishedGood",
"status": "Active",
"unit": "Each",
"barcode": "string",
"upc": "string",
"ean": "string",
"mpn": "string",
"purchasable": true,
"isSellable": true,
"isPurchasable": true,
"isTaxable": true,
"requiresShipping": true,
"tags": [
"string"
],
"imageIds": [
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
],
"imageUrls": [
"string"
],
"defaultImageUrl": "string",
"groupAssignment": {
"groupId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"optionValues": {
"key": "string"
},
"position": 0
},
"supplierId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"dateCreated": "2026-09-29T08:00:00Z",
"metadata": {
"key": "string"
}
},
"optionValues": {
"key": "string"
},
"position": 0
}'{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"optionAxes": [
"string"
],
"primaryProductId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"externalGroupId": "string",
"members": [
{}
],
"dateCreated": "2026-09-29T08:00:00Z"
},
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Remove member
DELETE/api/v1/products/groups/{groupId}/members/{productId}
Access. Send a bearer token or an API key. The caller needs the Products delete permission.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
groupId | path | string (uuid) | Yes | |
productId | path | string (uuid) | Yes |
Response
200. Returns a SingleResult envelope. The data field is boolean.
curl -X DELETE "https://api.miridia.io/api/v1/products/groups/{groupId}/members/{productId}" \
-H "Authorization: Bearer $MIRIDIA_TOKEN" \
-H "X-Business-Id: $MIRIDIA_BUSINESS_ID"{
"message": "string",
"messages": [
{
"title": "string",
"message": "string",
"level": "Standard",
"icon": "SyncAlert",
"code": "string"
}
],
"data": true,
"statusCode": "OK",
"canRead": true,
"canEdit": true,
"canDelete": true
}Models
The operations on this page use these object types. Select a type to see its fields.
CreateProductGroupMember
A member to place in a new group: EITHER an existing product (productId) OR a brand-new product to mint (newProduct). Exactly one must be set.
| Field | Type | Description |
|---|---|---|
productId | string (uuid) | |
newProduct | CreateProductRequest | |
optionValues | map<string, string> | |
position | integer (int32) |
CreateProductPriceRequest
| Field | Type | Description |
|---|---|---|
subTotal | number (double) | Limits: minimum 0. |
totalPrice | number (double) | Limits: minimum 0. |
totalTax | number (double) | Limits: minimum 0. |
totalDiscount | number (double) | Limits: minimum 0. |
discount | number (double) | Limits: minimum 0. |
discountType | enum DiscountType | One of: None, Percentage, FixedValue. |
taxIncluded | boolean | |
taxRate | number (double) | Limits: minimum 0, maximum 100. |
taxType | enum TaxType | One of: None, Sales, Vat, Gst, Pst, Hst, Qst, Ist, Ust, Cst. |
CreateProductRequest
| Field | Type | Description |
|---|---|---|
sku | string | |
title | string | Limits: maximum 100 characters. |
description | string | Provides a summary of the product Limits: maximum 1000 characters. |
body | string | |
price | CreateProductPriceRequest | |
geometry | ProductDimensionRequest | |
productType | enum ProductType | One of: FinishedGood, RawMaterial, Component, Consumable, Service. |
status | enum ProductStatus | One of: Active, Inactive, Discontinued. |
unit | enum UnitOfMeasure | One of: Each, Kilogram, Gram, Litre, Millilitre, Metre, Centimetre, SquareMetre, CubicMetre, Pair, Pack, Box, Roll, Sheet. |
barcode | string | |
upc | string | |
ean | string | |
mpn | string | |
purchasable | boolean | |
isSellable | boolean | |
isPurchasable | boolean | |
isTaxable | boolean | |
requiresShipping | boolean | |
tags | string[] | |
imageIds | string (uuid)[] | Images which have been uploaded via the FileController. |
imageUrls | string[] | |
defaultImageUrl | string | |
groupAssignment | ProductGroupAssignmentRequest | |
supplierId | string (uuid) | |
dateCreated | string (date-time) | When the product was created. Optional; defaults to now. Lets seeded/synthetic catalogs show products appearing over time rather than all on seed day. |
metadata | map<string, string> |
CurrencyResponse
| Field | Type | Description |
|---|---|---|
iso4217 | string | |
utf8Symbol | string | |
currencyCode | enum CurrencyCode | One of: Invalid, Eur, Usd, Gbp, Zar, Zmw. |
ProductDimensionRequest
| Field | Type | Description |
|---|---|---|
weight | number (double) | Limits: minimum 0. |
width | number (double) | Limits: minimum 0. |
length | number (double) | Limits: minimum 0. |
height | number (double) | Limits: minimum 0. |
lengthType | enum LengthType | One of: Unknown, Centimeter, Meter, Inch, Foot. |
weightType | enum WeightType | One of: Unknown, Kilogram, Tonne, Pound, Stone, UsTon, ImperialTon, Gram. |
ProductGroupAssignmentRequest
Create-time membership of a product in an existing product group.
| Field | Type | Description |
|---|---|---|
groupId | string (uuid) | |
optionValues | map<string, string> | Per-axis values for this member, e.g. {"Pack Size": "4-pack"}. |
position | integer (int32) | Display order within the group; appended (0) when omitted. |
ProductGroupMemberResponse
| Field | Type | Description |
|---|---|---|
productId | string (uuid) | |
sku | string | |
title | string | |
totalAvailableQuantity | number (double) | |
currentPrice | ProductPriceDetailsResponse | |
optionValues | map<string, string> | |
position | integer (int32) | |
isPrimary | boolean |
ProductGroupResponse
| Field | Type | Description |
|---|---|---|
id | string (uuid) | |
name | string | |
description | string | |
optionAxes | string[] | |
primaryProductId | string (uuid) | |
externalGroupId | string | Null = merchant-owned. |
members | ProductGroupMemberResponse[] | |
dateCreated | string (date-time) |
ProductPriceDetailsResponse
| Field | Type | Description |
|---|---|---|
subTotal | number (double) | |
totalPrice | number (double) | |
totalTax | number (double) | |
totalDiscount | number (double) | |
discount | number (double) | |
discountType | enum DiscountType | One of: None, Percentage, FixedValue. |
taxIncluded | boolean | |
taxRate | number (double) | |
taxType | enum TaxType | One of: None, Sales, Vat, Gst, Pst, Hst, Qst, Ist, Ust, Cst. |
currency | CurrencyResponse | |
id | string (uuid) | |
purchasable | boolean | |
priceType | enum PriceType | One of: Selling, Purchase, Cost. |
source | enum PriceSource | One of: Manual, SupplierUpdate, Import, Sync, Migration. |
notes | string | |
effectiveDate | string (date-time) | |
currencyMetadata | CurrencyResponse | |
priceUnit | enum UnitOfMeasure | One of: Each, Kilogram, Gram, Litre, Millilitre, Metre, Centimetre, SquareMetre, CubicMetre, Pair, Pack, Box, Roll, Sheet. |
pricePackQuantity | number (double) | |
pricePerUnit | number (double) | |
basis | enum PriceResolutionBasis | One of: FixedItem, PeggedItem, ListRule. |
adjustmentType | enum PriceAdjustmentType | One of: Percentage, Amount. |
adjustmentValue | number (double) |