Windchill REST API — Regulatory Data Mapping Architecture
The core problem is treating this as a point-to-point extraction rather than a transformation layer concern. The mapping logic needs to live in a dedicated middleware tier, not scattered across API calls.
API Entry Points (Windchill 11.1)
Windchill’s PTC Navigate / REST API exposes parts and attributes via:
GET /Windchill/servlet/odata/PTC Core/Parts('{oid}')
GET /Windchill/servlet/odata/PTC Core/Parts?$filter=number eq '{partNum}'&$expand=Attributes
For multi-value attributes, expand IBAValues explicitly — otherwise the response collapses them:
$expand=Attributes($expand=IBAValues)
The raw attribute names come back as Windchill internal names (e.g., PFMD_PART_NUMBER), not display labels. Pull the type descriptor endpoint to build your name→label map once and cache it — verify the exact OData entity path in your version.
Reusable Mapping Template Strategy
Define mapping templates as declarative JSON schemas rather than hardcoded transform logic. Each regulatory submission type (FDA 510(k), EU MDR, etc.) gets its own schema:
{
"submission_type": "FDA_510k",
"version": "2.1",
"field_mappings": [
{
"regulatory_field": "Device Identifier",
"windchill_attribute": "PFMD_PART_NUMBER",
"transform": "passthrough",
"required": true,
"validation": { "type": "string", "maxLength": 64 }
},
{
"regulatory_field": "ManufactureDate",
"windchill_attribute": "CREATION_DATE",
"transform": "iso8601",
"required": true
},
{
"regulatory_field": "IndicationsForUse",
"windchill_attribute": ["USE_INDICATION_PRIMARY", "USE_INDICATION_SECONDARY"],
"transform": "concat",
"delimiter": "; ",
"required": false
}
],
"derived_fields": [
{
"regulatory_field": "SubmissionDate",
"source": "runtime",
"value": "TODAY_ISO8601"
}
]
}
This decouples mapping rules from code. Adding a new submission type = new JSON file, no deployment.
Transform Functions to Standardize
Build a transform library with at minimum:
iso8601 — normalize any Windchill date string using a parsing library (handle MM/dd/yyyy, epoch ms, and ISO variants)
concat — join multi-value IBA arrays with configurable delimiter
lookup — map Windchill enumerated values to regulatory codeset equivalents (critical for IEC 62304 software class mappings)
derived — compute fields with no Windchill equivalent (e.g., regulatory agency code based on target market attribute)
Pre-Submission Validation Gate
Run JSON Schema validation against each mapping template before the payload leaves your middleware. Catch required field gaps, format violations, and enum mismatches at extraction time.
For fields with no Windchill equivalent, flag them as UNMAPPED in a validation report rather than letting null values reach the regulatory portal. This shifts error detection from submission time to data extraction time — the 24–48 hour feedback loop from FDA/CE portals is eliminated for structural errors.
Wire the validation output to a compliance dashboard (even a simple database table) so teams see mapping coverage percentage per product category before initiating submissions.
Middleware Stack Note
If you’re using MuleSoft, Boomi, or Azure Logic Apps as middleware — verify OData connector compatibility with Windchill 11.1 M030’s OData version (3.0 vs 4.0 behavior differs). The PTC ThingWorx integration layer is also available in some 11.x deployments and offers tighter attribute metadata access, but adds licensing considerations.
This draft is based on general Windchill knowledge. It has not been verified against your specific version and environment. Practitioners: verify the steps and share your experience below.