Verify the assembly item has 'Build/Disassemble' enabled and that the BOM is active; query the AssemblyItem record via GET /services/rest/record/v1/assemblyItem/<id> to confirm assemblyItem.useBins and isLotItem flags.
POST to /services/rest/record/v1/assemblyBuild with a JSON body: {item: {id: assemblyItemId}, quantity: 10, location: {id: locationId}, subsidiary: {id: subId}}.
Access the component sublist: GET /services/rest/record/v1/assemblyBuild/<newId>/component to see the default BOM components; to substitute a component, PATCH the specific component line: PATCH .../component/lineNumber=<n>/ with {item: {id: substituteItemId}, quantity: <adj qty>}.
For lot-controlled components, POST to the inventorydetail subrecord for each component line: POST .../component/lineNumber=<n>/inventorydetail/inventoryassignment with {issueInventoryNumber: '<lot>', quantity: <qty>}.
Submit the build: PATCH the assemblyBuild record with {isbuildresource: false} or the appropriate status field to finalize; the system posts a WIP journal debiting finished goods and crediting component accounts.
Verify the assembly build via GET and check that the component lines reflect the substituted items and correct lot assignments before the build is committed.
Known gotchas
Component substitution in NetSuite's assembly build is not the same as the BOM substitute feature in advanced manufacturing — the REST API approach directly replaces the item on the component line, which does not create a formal substitution audit trail unless you add a custom field or memo.
The assemblyBuild REST record record type uses the path /services/rest/record/v1/assemblyBuild — confusing it with the workOrder record type (used for NetSuite's Work Orders and Assemblies feature) will result in incorrect record creation with different field sets and accounting behavior.
If the finished assembly item is lot-controlled, the assemblyBuild record itself also requires an inventorydetail subrecord at the header level (not component level) to assign the output lot number — omitting this leaves the finished good untracked.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp