Skip to content

API Calls

Base: https://api.g3nretailstack.com/pvm

Source of truth: /internal-docs/pvm-openapi.yaml/pvm/openapi.yaml

Notes: samples are schema-derived placeholders. Replace placeholder values (ORGCODE, SESSION_GUID, etc.) with real values.

Inventory

MethodPathSummaryRequest schemaResponse schema
GET/alias/listList aliasesNoneEnvelope
POST/alias/removeRemove aliasNoneEnvelope
POST/alias/setSet aliasNoneEnvelope
POST/alternative/addAdd alternativeNoneEnvelope
GET/alternative/listList alternativesNoneEnvelope
POST/alternative/statusSet alternative statusNoneEnvelope
POST/barcode/addAdd barcodeNoneEnvelope
GET/barcode/getGet barcodeNoneEnvelope
GET/barcode/listList barcodes for a variantNoneEnvelope
GET/barcode/resolveResolve barcodeNoneEnvelope
POST/barcode/set_primarySet primary barcodeNoneEnvelope
POST/barcode/statusSet barcode statusNoneEnvelope
GET/brandList brandsNoneEnvelope
POST/brandCreate brandNoneEnvelope
GET/brand/getGet brandNoneEnvelope
POST/brand/link/addLink brand to supplierNoneEnvelope
GET/brand/link/listList brand linksNoneEnvelope
POST/brand/link/removeUnlink brand from supplierNoneEnvelope
POST/brand/link/set_primarySet primary brand link for supplier_typeNoneEnvelope
POST/brand/statusSet brand statusNoneEnvelope
POST/brand/updateUpdate brand (inactive-only)NoneEnvelope
GET/categoryList categories (by department)NoneEnvelope
POST/categoryCreate categoryNoneEnvelope
GET/category/getGet categoryNoneEnvelope
POST/category/statusSet category statusNoneEnvelope
POST/category/updateUpdate category (inactive-only)NoneEnvelope
POST/commentAdd commentNoneEnvelope
GET/comment/listList commentsNoneEnvelope
GET/comment/reportReport top-N largest comments (by size)NoneEnvelope
POST/comment/statusSet comment status (archive/doomed)NoneEnvelope
GET/departmentList departments (by division)NoneEnvelope
POST/departmentCreate departmentNoneEnvelope
GET/department/getGet departmentNoneEnvelope
POST/department/statusSet department statusNoneEnvelope
POST/department/updateUpdate department (inactive-only)NoneEnvelope
GET/divisionList divisionsNoneEnvelope
POST/divisionCreate divisionNoneEnvelope
GET/division/getGet divisionNoneEnvelope
POST/division/statusSet division statusNoneEnvelope
POST/division/updateUpdate division (inactive-only)NoneEnvelope
GET/history/statusStatus change history (styles/variants)NoneEnvelope
POST/identifier/addAdd identifierNoneEnvelope
GET/identifier/historyIdentifier historyNoneEnvelope
GET/identifier/listList identifiers for a variantNoneEnvelope
GET/identifier/resolveResolve identifierNoneEnvelope
POST/identifier/transferTransfer identifierNoneEnvelope
POST/kit/component/addAdd kit componentNoneEnvelope
GET/kit/component/listList kit componentsNoneEnvelope
POST/kit/component/removeRemove kit componentNoneEnvelope
POST/kit/configure/validateValidate configurable kit configurationNoneEnvelope
POST/kit/rule/addAdd/update constraint rule for configurable kitNoneEnvelope
GET/kit/rule/listList constraint rules for configurable kitNoneEnvelope
POST/kit/rule/removeRemove constraint ruleNoneEnvelope
POST/kit/slot/addAdd/update configurable kit slotNoneEnvelope
POST/kit/slot/choice/addAdd choice to configurable kit slotNoneEnvelope
GET/kit/slot/choice/listList choices for configurable kit slotNoneEnvelope
POST/kit/slot/choice/removeRemove choice from configurable kit slotNoneEnvelope
GET/kit/slot/listList configurable kit slotsNoneEnvelope
POST/kit/slot/removeRemove configurable kit slotNoneEnvelope
GET/manufacturerList manufacturersNoneEnvelope
POST/manufacturerCreate manufacturerNoneEnvelope
GET/manufacturer/getGet manufacturerNoneEnvelope
POST/manufacturer/statusSet manufacturer statusNoneEnvelope
POST/manufacturer/updateUpdate manufacturerNoneEnvelope
POST/ogmCreate OGMNoneEnvelope
POST/ogm/cloneClone OGM revisionNoneEnvelope
GET/ogm/getGet OGMNoneEnvelope
GET/ogm/listList OGMsNoneEnvelope
POST/ogm/statusSet OGM statusNoneEnvelope
GET/optionList optionsNoneEnvelope
POST/optionCreate optionNoneEnvelope
GET/option_groupList option groupsNoneEnvelope
POST/option_groupCreate option groupNoneEnvelope
GET/option_group/getGet option groupNoneEnvelope
POST/option_group/statusSet option group statusNoneEnvelope
POST/option_group/updateUpdate option groupNoneEnvelope
GET/option/getGet optionNoneEnvelope
POST/option/statusSet option statusNoneEnvelope
POST/option/updateUpdate optionNoneEnvelope
POST/product/compliance/checkCheck compliance status for variantsNoneEnvelope
POST/product/recommendGet product recommendations for given variant IDsNoneEnvelope
POST/product/searchSearch products (styles and variants)NoneEnvelope
GET/recommendation/rule/getFetch a recommendation rule by IDNoneEnvelope
GET/recommendation/rule/listList recommendation rules with optional status filterNoneEnvelope
POST/recommendation/rule/setCreate or update a recommendation ruleNoneEnvelope
POST/recommendation/rule/statusUpdate recommendation rule statusNoneEnvelope
GET/resolve/aliasResolve by aliasNoneEnvelope
GET/resolve/barcodeResolve barcodeNoneEnvelope
GET/resolve/codeResolve by codeNoneEnvelope
GET/seasonList seasonsNoneEnvelope
POST/seasonCreate seasonNoneEnvelope
GET/season/getGet seasonNoneEnvelope
POST/season/statusSet season statusNoneEnvelope
POST/season/updateUpdate season (inactive-only)NoneEnvelope
GET/statHealth checkNoneEnvelope
GET/styleList stylesNoneEnvelope
POST/styleCreate style (org-scoped)NoneEnvelope
GET/style/getGet styleNoneEnvelope
POST/style/ogm/setSet style OGM rev (marks variants stale)NoneEnvelope
POST/style/statusSet style statusNoneEnvelope
POST/style/updateUpdate style (inactive only)NoneEnvelope
POST/supplementary/addAdd supplementary linkNoneEnvelope
GET/supplementary/listList supplementary linksNoneEnvelope
POST/supplementary/statusSet supplementary statusNoneEnvelope
POST/variantCreate variantNoneEnvelope
GET/variant/getGet variantNoneEnvelope
GET/variant/listList variantsNoneEnvelope
POST/variant/recreateRecreate variant on target OGM revNoneEnvelope
GET/variant/stale/listList stale variants (matrix_rev != style ogm_rev)NoneEnvelope
POST/variant/statusSet variant statusNoneEnvelope
POST/variant/updateUpdate variant (inactive only)NoneEnvelope
GET/vendorList vendorsNoneEnvelope
POST/vendorCreate vendorNoneEnvelope
GET/vendor/getGet vendorNoneEnvelope
POST/vendor/statusSet vendor statusNoneEnvelope
POST/vendor/updateUpdate vendorNoneEnvelope

Call details

GET /alias/list

Purpose: List aliases

Notes: Requires Product and Vendor Viewer or above. Returns tag/value pairs for the variant with pagination.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "alias_id": "string",
        "style_id": "STYLE_ID",
        "variant_id": "VARIANT_ID"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /alias/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /alias/remove

Purpose: Remove alias

Notes: Requires Product Model Administrator. Removes the specific tag/value pair (expected_revision required).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "alias_id": "string",
    "style_id": "STYLE_ID",
    "variant_id": "VARIANT_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /alias/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /alias/set

Purpose: Set alias

Notes: Requires Product Model Administrator. Up to 16 aliases per variant; (tag,value) must be unique per org; tag is unique per variant (remove before changing).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "alias_id": "string",
    "style_id": "STYLE_ID",
    "variant_id": "VARIANT_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /alias/set",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /alternative/add

Purpose: Add alternative

Notes: Requires Product Model Administrator. Adds variant→variant link with priority/auto_select flags; edits allowed while source variant inactive.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "alt_variant_id": "VARIANT_ID",
    "priority": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /alternative/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /alternative/list

Purpose: List alternatives

Notes: Requires Product and Vendor Viewer or above. Lists alternative links for the variant with pagination.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "variant_id": "VARIANT_ID",
        "alt_variant_id": "VARIANT_ID",
        "priority": 0
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /alternative/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /alternative/status

Purpose: Set alternative status

Notes: Requires Product Model Administrator. Updates status (active/inactive/doomed) for an alternative link.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "alt_variant_id": "VARIANT_ID",
    "priority": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /alternative/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /barcode/add

Purpose: Add barcode

Notes: Requires Product Model Administrator. Digits-only values with valid check digits; (org, value) unique among non-doomed. Reuse allowed only when prior value inactive/doomed AND allow_reuse=true + reason (reason required when reassigning).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode_id": "CODE1",
    "variant_id": "VARIANT_ID",
    "value": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /barcode/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /barcode/get

Purpose: Get barcode

Notes: Requires Product and Vendor Viewer or above. Returns barcode detail including packaging_level and primary flag.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode_id": "CODE1",
    "variant_id": "VARIANT_ID",
    "value": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /barcode/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /barcode/list

Purpose: List barcodes for a variant

Notes: Requires Product and Vendor Viewer or above. Lists barcodes for the variant with pagination.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "barcode_id": "CODE1",
      "variant_id": "VARIANT_ID",
      "value": "string"
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /barcode/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /barcode/resolve

Purpose: Resolve barcode

Notes: Requires Product and Vendor Viewer or above. Returns current owner (variant/code) for the barcode value; rejects invalid check digits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode": {
      "barcode_id": "CODE1",
      "variant_id": "VARIANT_ID",
      "value": "string"
    },
    "owner": {
      "variant_id": "VARIANT_ID",
      "variant_code": "CODE1"
    }
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /barcode/resolve",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /barcode/set_primary

Purpose: Set primary barcode

Notes: Requires Product Model Administrator. One primary per packaging_level; ensures barcode belongs to variant. Requires expected_revision for optimistic concurrency.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode_id": "CODE1",
    "is_primary": false,
    "revision": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /barcode/set_primary",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /barcode/status

Purpose: Set barcode status

Notes: Requires Product Model Administrator. Doom is terminal.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode_id": "CODE1",
    "variant_id": "VARIANT_ID",
    "value": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /barcode/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /brand

Purpose: List brands

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "brand_id": "string",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /brand",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand

Purpose: Create brand

Notes: Requires Product Model Administrator (owners allowed). Codes immutable; inactive-only edits. If a style sets brand_id, the brand must be linked to all style suppliers.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /brand/get

Purpose: Get brand

Notes: Requires Viewer or above. Lookup by brand_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /brand/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand/link/add

Purpose: Link brand to supplier

Notes: Requires Product Model Administrator (owners allowed). Creates/upserts a brand↔supplier link.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "supplier_type": "vendor",
    "supplier_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand/link/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

Purpose: List brand links

Notes: Requires Viewer or above. List by brand_id (optional supplier_type filter) or by supplier_type+supplier_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "brand_id": "string",
        "supplier_type": "vendor",
        "supplier_id": "string"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /brand/link/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand/link/remove

Purpose: Unlink brand from supplier

Notes: Requires Product Model Administrator (owners allowed). Removes a brand↔supplier link.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "supplier_type": "vendor",
    "supplier_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand/link/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand/link/set_primary

Purpose: Set primary brand link for supplier_type

Notes: Requires Product Model Administrator (owners allowed). Brand must already be linked to the supplier. If a primary already exists for this supplier_type, expected_revision is required.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "supplier_type": "vendor",
    "supplier_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand/link/set_primary",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand/status

Purpose: Set brand status

Notes: Requires Product Model Administrator (owners allowed).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /brand/update

Purpose: Update brand (inactive-only)

Notes: Requires Product Model Administrator (owners allowed). Only caption updates; code immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "brand_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /brand/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /category

Purpose: List categories (by department)

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/parent/root/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "category_id": "CATEGORY_ID",
        "division_id": "string",
        "department_id": "string"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /category",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /category

Purpose: Create category

Notes: Requires Product Model Administrator (owners allowed). Category is a tree inside a department (acyclic, max depth 16).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "category_id": "CATEGORY_ID",
    "division_id": "string",
    "department_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /category",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /category/get

Purpose: Get category

Notes: Requires Viewer or above. Lookup by category_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "category_id": "CATEGORY_ID",
    "division_id": "string",
    "department_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /category/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /category/status

Purpose: Set category status

Notes: Requires Product Model Administrator (owners allowed). Dooming blocked while non-doomed child categories exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "category_id": "CATEGORY_ID",
    "division_id": "string",
    "department_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /category/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /category/update

Purpose: Update category (inactive-only)

Notes: Requires Product Model Administrator (owners allowed). Caption and leaf-only parent changes; code/department immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "category_id": "CATEGORY_ID",
    "division_id": "string",
    "department_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /category/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /comment

Purpose: Add comment

Notes: Requires Product and Vendor Viewer or above. Comments are immutable; attachments up to 128 MB each with optional captions; supports threaded replies via parent_comment_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "comment_id": "string",
      "revision": "string",
      "status": "current"
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /comment",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /comment/list

Purpose: List comments

Notes: Requires Product and Vendor Viewer or above. Filters by target/user/status with pagination; returns attachments metadata.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "comment_id": "string",
        "revision": "string",
        "status": "current"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /comment/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /comment/report

Purpose: Report top-N largest comments (by size)

Notes: Requires Product Model Administrator (or org owner). Returns largest comments by attachment size to detect abuse.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "comment_id": "string",
      "target_type": "string",
      "target_id": "string"
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /comment/report",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /comment/status

Purpose: Set comment status (archive/doomed)

Notes: Requires Product Model Administrator. Content immutable; only status transitions to archived/doomed allowed.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "comment_id": "string",
    "revision": "string",
    "status": "current"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /comment/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /department

Purpose: List departments (by division)

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/division/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "department_id": "string",
        "division_id": "string",
        "code": "CODE1"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /department",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /department

Purpose: Create department

Notes: Requires Product Model Administrator (owners allowed). Codes immutable; inactive-only edits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "department_id": "string",
    "division_id": "string",
    "code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /department",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /department/get

Purpose: Get department

Notes: Requires Viewer or above. Lookup by department_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "department_id": "string",
    "division_id": "string",
    "code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /department/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /department/status

Purpose: Set department status

Notes: Requires Product Model Administrator (owners allowed). Dooming blocked while non-doomed categories exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "department_id": "string",
    "division_id": "string",
    "code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /department/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /department/update

Purpose: Update department (inactive-only)

Notes: Requires Product Model Administrator (owners allowed). Only caption updates; code/division immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "department_id": "string",
    "division_id": "string",
    "code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /department/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /division

Purpose: List divisions

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "division_id": "string",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /division",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /division

Purpose: Create division

Notes: Requires Product Model Administrator (owners allowed). Codes immutable; inactive-only edits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "division_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /division",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /division/get

Purpose: Get division

Notes: Requires Viewer or above. Lookup by division_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "division_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /division/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /division/status

Purpose: Set division status

Notes: Requires Product Model Administrator (owners allowed). Dooming blocked while non-doomed departments exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "division_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /division/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /division/update

Purpose: Update division (inactive-only)

Notes: Requires Product Model Administrator (owners allowed). Only caption updates; code immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "division_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /division/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /history/status

Purpose: Status change history (styles/variants)

Notes: Requires Product and Vendor Viewer or above. Returns chronological status transitions with actor/reason; paginated.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "target_type": "string",
        "target_id": "string",
        "from_status": "active"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /history/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /identifier/add

Purpose: Add identifier

Notes: Requires Product Model Administrator. Adds/rotates the current identifier for a variant, logs history, and enforces uniqueness across non-doomed variants.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "variant_id": "VARIANT_ID",
    "type": "sku"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /identifier/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /identifier/history

Purpose: Identifier history

Notes: Requires Product and Vendor Viewer or above. Returns the history chain for the identifier {type,value} (newest first), paginated with limit/next_token.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "type": "sku",
        "value": "string",
        "tag": "string"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /identifier/history",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /identifier/list

Purpose: List identifiers for a variant

Notes: Requires Product and Vendor Viewer or above. Returns identifiers for a variant (optional type filter), paginated with limit/next_token. Includes current boolean per item. Default excludes transferred identifiers; set include_transferred=true to include.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "style_id": "STYLE_ID",
        "variant_id": "VARIANT_ID",
        "type": "sku"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /identifier/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /identifier/resolve

Purpose: Resolve identifier

Notes: Requires Product and Vendor Viewer or above. Returns current owner and optional history when include_history=true.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "type": "sku",
    "value": "string",
    "current_owner": {
      "variant_id": "VARIANT_ID",
      "variant_code": "CODE1"
    }
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /identifier/resolve",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /identifier/transfer

Purpose: Transfer identifier

Notes: Requires Product Model Administrator. Moves the current identifier to another variant, enforcing uniqueness and recording history with the provided reason. Requires expected_revision for optimistic concurrency.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "type": "sku",
    "value": "string",
    "from_variant_id": "VARIANT_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /identifier/transfer",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/component/add

Purpose: Add kit component

Notes: Requires Product Model Administrator. Kit variant must be inactive; validates qty/uom.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "component_variant_id": "VARIANT_ID",
    "qty": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/component/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /kit/component/list

Purpose: List kit components

Notes: Requires Product and Vendor Viewer or above. Lists components for a kit with pagination.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "kit_variant_id": "VARIANT_ID",
        "component_variant_id": "VARIANT_ID",
        "qty": 0
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /kit/component/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/component/remove

Purpose: Remove kit component

Notes: Requires Product Model Administrator. Kit variant must be inactive.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "component_variant_id": "VARIANT_ID",
    "removed": false
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/component/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/configure/validate

Purpose: Validate configurable kit configuration

Notes: Read-only. Validates a (partial) configuration against kit slots/choices. Returns errors and available choices per slot.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "valid": false,
    "errors": [
      "string"
    ],
    "available_choices": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/configure/validate",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/rule/add

Purpose: Add/update constraint rule for configurable kit

Notes: Requires Product Model Administrator. Kit must be configurable and inactive. Trigger and target slots must exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "rule_id": "string",
    "rule_type": "include"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/rule/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /kit/rule/list

Purpose: List constraint rules for configurable kit

Notes: Requires Product and Vendor Viewer or above. Sorted by priority descending.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "kit_variant_id": "VARIANT_ID",
        "rule_id": "string",
        "rule_type": "include"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /kit/rule/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/rule/remove

Purpose: Remove constraint rule

Notes: Requires Product Model Administrator.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "rule_id": "string",
    "removed": false
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/rule/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/slot/add

Purpose: Add/update configurable kit slot

Notes: Requires Product Model Administrator. Kit variant must be kit_type=configurable and inactive.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "slot_code": "CODE1",
    "label": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/slot/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/slot/choice/add

Purpose: Add choice to configurable kit slot

Notes: Requires Product Model Administrator. Validates choice variant exists and is not doomed.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "slot_code": "CODE1",
    "variant_id": "VARIANT_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/slot/choice/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /kit/slot/choice/list

Purpose: List choices for configurable kit slot

Notes: Requires Product and Vendor Viewer or above. Sorted by sort_order.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "kit_variant_id": "VARIANT_ID",
        "slot_code": "CODE1",
        "variant_id": "VARIANT_ID"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /kit/slot/choice/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/slot/choice/remove

Purpose: Remove choice from configurable kit slot

Notes: Requires Product Model Administrator. Deletes choice, inbound pointer, and decrements guard.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "slot_code": "CODE1",
    "variant_id": "VARIANT_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/slot/choice/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /kit/slot/list

Purpose: List configurable kit slots

Notes: Requires Product and Vendor Viewer or above. Sorted by sort_order.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "kit_variant_id": "VARIANT_ID",
        "slot_code": "CODE1",
        "label": "string"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /kit/slot/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /kit/slot/remove

Purpose: Remove configurable kit slot

Notes: Requires Product Model Administrator. Cascade-deletes all choices and inbound pointers.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "kit_variant_id": "VARIANT_ID",
    "slot_code": "CODE1",
    "removed": false
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /kit/slot/remove",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /manufacturer

Purpose: List manufacturers

Notes: Requires Viewer or above. Defaults status=verified. Paginates with limit/next_token; optional text search. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "manufacturer_id": "MANUFACTURER_ID",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /manufacturer",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /manufacturer

Purpose: Create manufacturer

Notes: Requires Vendor Contract Administrator (owners allowed). Codes immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "manufacturer_id": "MANUFACTURER_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /manufacturer",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /manufacturer/get

Purpose: Get manufacturer

Notes: Requires Viewer or above. Lookup by manufacturer_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "manufacturer_id": "MANUFACTURER_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /manufacturer/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /manufacturer/status

Purpose: Set manufacturer status

Notes: Requires Vendor Contract Administrator (owners allowed). Requires expected_revision.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "manufacturer_id": "MANUFACTURER_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /manufacturer/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /manufacturer/update

Purpose: Update manufacturer

Notes: Requires Vendor Contract Administrator (owners allowed). Only caption updates; code immutable. Requires expected_revision.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "manufacturer_id": "MANUFACTURER_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /manufacturer/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /ogm

Purpose: Create OGM

Notes: Requires Product Model Administrator. Creates a revisioned OGM (immutable per rev) with optional default fields for downstream style/variant propagation.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "ogm_id": "string",
    "code": "CODE1",
    "ogm_rev": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /ogm",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /ogm/clone

Purpose: Clone OGM revision

Notes: Requires Product Model Administrator. Clones an existing revision to a new revision (optional new code), leaving prior rev immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "ogm_id": "string",
    "code": "CODE1",
    "ogm_rev": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /ogm/clone",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /ogm/get

Purpose: Get OGM

Notes: Requires Product and Vendor Viewer or above. Returns the requested OGM revision (current if ogm_rev omitted).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "ogm_id": "string",
    "code": "CODE1",
    "ogm_rev": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /ogm/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /ogm/list

Purpose: List OGMs

Notes: Requires Product and Vendor Viewer or above. Paginates with limit/next_token; filters by status/text; returns revs and groups.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "ogm_id": "string",
      "code": "CODE1",
      "ogm_rev": 0
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /ogm/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /ogm/status

Purpose: Set OGM status

Notes: Requires Product Model Administrator. OGM edits are clone-only; status changes respect in-use constraints (active styles/variants block doom).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "ogm_id": "string",
    "code": "CODE1",
    "ogm_rev": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /ogm/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /option

Purpose: List options

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/text; can list within a group using option_group_id or group_code. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "option_id": "string",
        "option_group_id": "string",
        "group_code": "CODE1"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /option",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option

Purpose: Create option

Notes: Requires Product Model Administrator. Option codes are unique org-wide. Requires option_group_id or group_code.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_id": "string",
    "option_group_id": "string",
    "group_code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /option_group

Purpose: List option groups

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "option_group_id": "string",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /option_group",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option_group

Purpose: Create option group

Notes: Requires Product Model Administrator. Codes immutable; inactive-only edits. supplier_scope references must be verified suppliers.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_group_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option_group",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /option_group/get

Purpose: Get option group

Notes: Requires Viewer or above. Lookup by option_group_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_group_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /option_group/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option_group/status

Purpose: Set option group status

Notes: Requires Product Model Administrator. Requires expected_revision. Lookup by option_group_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_group_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option_group/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option_group/update

Purpose: Update option group

Notes: Requires Product Model Administrator. Inactive-only; code immutable. Requires expected_revision. Lookup by option_group_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_group_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option_group/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /option/get

Purpose: Get option

Notes: Requires Viewer or above. Lookup by option_id + option_group_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_id": "string",
    "option_group_id": "string",
    "group_code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /option/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option/status

Purpose: Set option status

Notes: Requires Product Model Administrator. Requires expected_revision. Lookup by option_id + option_group_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_id": "string",
    "option_group_id": "string",
    "group_code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /option/update

Purpose: Update option

Notes: Requires Product Model Administrator. Inactive-only; code immutable. Requires expected_revision. Lookup by option_id + option_group_id.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "option_id": "string",
    "option_group_id": "string",
    "group_code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /option/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /product/compliance/check

Purpose: Check compliance status for variants

Notes: Requires Product and Vendor Viewer or above. Checks compliance status (recall, stop_sale, Prop 65, sellability) for up to 50 variants.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "variant_id": "VARIANT_ID",
      "is_sellable_now": false,
      "status": "active"
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /product/compliance/check",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /product/recommend

Purpose: Get product recommendations for given variant IDs

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "recommendations": [
      {}
    ]
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /product/recommend",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /product/search

Purpose: Search products (styles and variants)

Notes: Requires Product and Vendor Viewer or above. Full-text product search across styles and variants with facet filters (brand, category, product_type). Backed by OpenSearch Serverless.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "results": [
      {
        "entity_type": "string",
        "entity_id": "string",
        "code": "CODE1"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /product/search",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /recommendation/rule/get

Purpose: Fetch a recommendation rule by ID

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "recommendation_rule": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /recommendation/rule/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /recommendation/rule/list

Purpose: List recommendation rules with optional status filter

Notes: Paginated; use limit and next_token.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "recommendation_rules": [
      {}
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /recommendation/rule/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /recommendation/rule/set

Purpose: Create or update a recommendation rule

Notes: If this updates a revisioned record, expected_revision is required.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "recommendation_rule": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /recommendation/rule/set",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /recommendation/rule/status

Purpose: Update recommendation rule status

Notes: If this updates a revisioned record, expected_revision is required.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "recommendation_rule": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /recommendation/rule/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /resolve/alias

Purpose: Resolve by alias

Notes: Requires Product and Vendor Viewer or above. Resolves alias tag/value pair to the owning variant.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "alias": {
      "tag": "string",
      "value": "string"
    },
    "variant_id": "VARIANT_ID",
    "variant_code": "CODE1"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /resolve/alias",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /resolve/barcode

Purpose: Resolve barcode

Notes: Requires Product and Vendor Viewer or above. Convenience resolver for barcode value → current variant owner; rejects invalid check digits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "barcode": {
      "barcode_id": "CODE1",
      "variant_id": "VARIANT_ID",
      "value": "string"
    },
    "owner": {
      "variant_id": "VARIANT_ID",
      "variant_code": "CODE1"
    }
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /resolve/barcode",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /resolve/code

Purpose: Resolve by code

Notes: Requires Product and Vendor Viewer or above. Resolves codes across multiple entities (deterministic priority order) and returns { code, target_type, target_id }.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "code": "CODE1",
    "target_type": "string",
    "target_id": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /resolve/code",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /season

Purpose: List seasons

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/text. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "season_id": "string",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /season",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /season

Purpose: Create season

Notes: Requires Product Model Administrator (owners allowed). Codes immutable; inactive-only edits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "season_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /season",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /season/get

Purpose: Get season

Notes: Requires Viewer or above. Lookup by season_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "season_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /season/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /season/status

Purpose: Set season status

Notes: Requires Product Model Administrator (owners allowed).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "season_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /season/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /season/update

Purpose: Update season (inactive-only)

Notes: Requires Product Model Administrator (owners allowed). Only caption updates; code immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "season_id": "string",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /season/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /stat

Purpose: Health check

Notes: Health check. No auth required. Returns service name and status.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "service": "string",
    "status": "active"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /stat",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /style

Purpose: List styles

Notes: Requires Viewer or above. Paginates with limit/next_token; filters by status/supplier/brand/category/text.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "style_id": "STYLE_ID",
        "code": "CODE1",
        "aliases": [
          {}
        ]
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /style",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /style

Purpose: Create style (org-scoped)

Notes: Requires Product Model Administrator (owners allowed). Enforces ≥1 vendor AND ≥1 manufacturer with primaries; if brand_id is set then the brand must be linked to all vendor_ids and manufacturer_ids; code/alias uniqueness; inactive-only edits.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "code": "CODE1",
    "aliases": [
      {
        "tag": "string",
        "value": "string"
      }
    ]
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /style",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /style/get

Purpose: Get style

Notes: Requires Viewer or above. Returns current style with suppliers/brand/category and ogm_rev. Lookup by style_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "code": "CODE1",
    "aliases": [
      {
        "tag": "string",
        "value": "string"
      }
    ]
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /style/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /style/ogm/set

Purpose: Set style OGM rev (marks variants stale)

Notes: Requires Product Model Administrator. Switches a style to a new OGM revision and marks variants on older matrix_rev as stale.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "ogm_id": "string",
    "ogm_rev": 0
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /style/ogm/set",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /style/status

Purpose: Set style status

Notes: Requires Product Model Administrator. Doom blocked if active variants exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "code": "CODE1",
    "aliases": [
      {
        "tag": "string",
        "value": "string"
      }
    ]
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /style/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /style/update

Purpose: Update style (inactive only)

Notes: Requires Product Model Administrator. Inactive-only; enforces ≥1 vendor AND ≥1 manufacturer with primaries; if brand_id is set then the brand must be linked to all vendor_ids and manufacturer_ids; code immutable; alias uniqueness.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "style_id": "STYLE_ID",
    "code": "CODE1",
    "aliases": [
      {
        "tag": "string",
        "value": "string"
      }
    ]
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /style/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /supplementary/add

Purpose: Add supplementary link

Notes: Requires Product Model Administrator. Adds supplementary (upsell/cross-sell/etc.) link; edits allowed while variant inactive; enforces kind/priority uniqueness per variant.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "sup_variant_id": "VARIANT_ID",
    "kind": "upsell"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /supplementary/add",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /supplementary/list

Purpose: List supplementary links

Notes: Requires Product and Vendor Viewer or above. Lists supplementary links for the variant with pagination.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "variant_id": "VARIANT_ID",
        "sup_variant_id": "VARIANT_ID",
        "kind": "upsell"
      }
    ],
    "next_token": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /supplementary/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /supplementary/status

Purpose: Set supplementary status

Notes: Requires Product Model Administrator. Updates status (active/inactive/doomed) for a supplementary link.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "sup_variant_id": "VARIANT_ID",
    "kind": "upsell"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /supplementary/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /variant

Purpose: Create variant

Notes: Requires Product Model Administrator (owners allowed). Enforces unique option signature per style among non-doomed variants; selections are resolved/validated against Option Group/Option records and must match the style OGM groups when present. Signature is derived from selections[].group_code + selections[].option_code only (size fields are ignored). Stale flagged when matrix_rev != style ogm_rev.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "code": "CODE1",
    "style_id": "STYLE_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /variant",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /variant/get

Purpose: Get variant

Notes: Requires Product and Vendor Viewer or above. Returns variant with signature, matrix_rev, stale flag (matrix_rev vs style ogm_rev), suppliers/brand/category from style. Lookup by variant_id + style_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "code": "CODE1",
    "style_id": "STYLE_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /variant/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /variant/list

Purpose: List variants

Notes: Requires Product and Vendor Viewer or above. Paginates with limit/next_token; filters by status/style/brand/vendor/manufacturer/category/control/service/kit; response includes stale flag when matrix_rev != style ogm_rev.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "variant_id": "VARIANT_ID",
        "code": "CODE1",
        "style_id": "STYLE_ID"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /variant/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /variant/recreate

Purpose: Recreate variant on target OGM rev

Notes: Requires Product Model Administrator. Rebuilds variant on target OGM rev (using current selections); fails if selections invalid on target rev.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "source_variant_id": "VARIANT_ID",
    "target_ogm_rev": 0,
    "revision": "string"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /variant/recreate",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /variant/stale/list

Purpose: List stale variants (matrix_rev != style ogm_rev)

Notes: Requires Product and Vendor Viewer or above. Lists variants whose matrix_rev lags the style’s current ogm_rev; paginated.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": [
    {
      "variant_id": "VARIANT_ID",
      "code": "CODE1",
      "style_id": "STYLE_ID"
    }
  ],
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /variant/stale/list",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /variant/status

Purpose: Set variant status

Notes: Requires Product Model Administrator. Doom blocked while outbound kit components/alternatives/supplementary links exist, and while active inbound links exist.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "code": "CODE1",
    "style_id": "STYLE_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /variant/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /variant/update

Purpose: Update variant (inactive only)

Notes: Requires Product Model Administrator. Inactive-only; updates caption/sku/service/kit flags and template/lifecycle overrides and recomputes effective defaults from the style.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "variant_id": "VARIANT_ID",
    "code": "CODE1",
    "style_id": "STYLE_ID"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /variant/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /vendor

Purpose: List vendors

Notes: Requires Viewer or above. Defaults status=verified. Paginates with limit/next_token; optional text search. Text search uses a tokenized search plane (eventually consistent); OpenSearch opt-in via org search_plane.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "items": [
      {
        "vendor_id": "VENDOR_ID",
        "code": "CODE1",
        "caption": "Example caption"
      }
    ],
    "next_token": {}
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /vendor",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /vendor

Purpose: Create vendor

Notes: Requires Vendor Contract Administrator (owners allowed). Codes immutable.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "vendor_id": "VENDOR_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /vendor",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

GET /vendor/get

Purpose: Get vendor

Notes: Requires Viewer or above. Lookup by vendor_id (code via /resolve/code).

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "vendor_id": "VENDOR_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "GET /vendor/get",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /vendor/status

Purpose: Set vendor status

Notes: Requires Vendor Contract Administrator (owners allowed). Requires expected_revision.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "vendor_id": "VENDOR_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /vendor/status",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}

POST /vendor/update

Purpose: Update vendor

Notes: Requires Vendor Contract Administrator (owners allowed). Only caption updates; code immutable. Requires expected_revision.

Request schema: None Response schema: Envelope

Sample request (schema-derived)

json
{}

Sample response (shape-only)

json
{
  "success": true,
  "data": {
    "vendor_id": "VENDOR_ID",
    "code": "CODE1",
    "caption": "Example caption"
  },
  "build": {
    "build_id": "MONDAY-0000000000"
  },
  "stats": {
    "call": "POST /vendor/update",
    "service": "pvm",
    "timestamp_utc": "2026-01-01T00:00:00Z"
  }
}