Added Job Operation Complete, completing a job operation the way the shop floor does: closes any open timers on the operation, records an optional final quantity and scrap, marks the operation complete, and readies downstream operations. When the completed operation is the item's last (or a split operation producing finished goods), goods are received into inventory (with optional location, lot number, and expiration; set addItemsToInventory to false to skip) and the item — and the job, once every item is done — is completed. Complements Add Quantity Completed, which records production without completing; quantity passed to complete is added on top of previously recorded quantity.
Added a read-only rates block to Operation Get, Operation List, and Operation Update responses, carrying the operation's hourly cost rates (setup, labor, overhead, machine) and hourly shop rates (setup, run, machine) in the shop's primary currency. A null rate inside the block means no operation-level rate is set and the work-center rates apply. Addition-only — existing payloads gain the new block but no field changes.
Added optional number to Item Update to support renaming items. Omitting the field (or sending null) keeps the current number. A rename enforces number uniqueness (400 on collision) and updates every reference to the item — BOM inputs, usage, purchase orders, and the system lot. Uniqueness is scoped to number + revision, so when renaming an item with multiple revisions, rename every revision of the family.
Added Reporting Material Requirements List endpoint returning per-operation required items and materials for scheduled jobs, with resolved required quantities (items in their unit of measure, materials as a weight in kilograms) plus collected and outstanding amounts. Lets consumers report material demand across scheduled operations in a single paged call instead of fanning out per job to routings, items-to-make, and operations.
Added workOrderId, workOrderName, workOrderOperationId, and workOrderOperationName to the timer response for List Job Tracking Timers and List Timers. Timers tracked against a work order now surface the work order and its operation names, which were previously populated only for job-tracked timers. This is an addition-only change — existing consumers are unaffected.
Fixed price on invoice discount line items reading as 0. The calculated discount amount (and the derived subtotal/discountedSubtotal on the generic line-item shape) is now computed from the invoice, so percentage and absolute discounts return their real value for both new and historical invoices. Affects the Invoice discount line item and line item endpoints.
Added item tag management endpoints: Item Tag Attach, Item Tag Detach, and Item Tags Replace. Attach and detach are idempotent; replace accepts the item's full tag set (an empty list clears all tags). Each returns the item's resulting tags, complementing the existing Item Tag List read endpoints.
Sales-order date fields (orderedDate, dueDate, productionDueDate, deliveryDueDate, and part-line-item deliveryDate) now use the calendar date exactly as written, ignoring any time-of-day and UTC offset in the supplied value. Previously an offset-bearing timestamp could roll the stored date to an adjacent day. Affects Sales Order Create, Update, and Patch, plus Sales Order Part Line Item Create, Update, and Patch. Consumers sending date-only values or midnight-UTC timestamps see no change.
Added Timer Create endpoint for recording completed setup, labor, and machine timer blocks with explicit startedOnUtc and stoppedOnUtc timestamps — for time captured outside Fulcrum (backdated up to 30 days).
Removed the incorrect minLength: 1 published on optional description fields across item, quote, sales-order, purchase-order, and invoice schemas. The server has always accepted empty descriptions; the published schema now agrees, so schema-validating clients no longer reject them.
Operation Get and Operation List now tolerate operations stored with a time option but no time unit, returning null time blocks for them instead of failing the whole request.
Added shipByDateBefore, shipByDateAfter, shippedDateBefore, and shippedDateAfter filters to Shipment List.
Added salesOrderId and purchaseOrderId filters to Shipment Line Items List; the line-item response now also carries shipmentStatus, shipByDate, shippedDate, and shippedDateOverride from the parent shipment.
Added calculated shipByDate to Sales Order Get, List, and Update responses — the earliest ship-by date across the order's non-cancelled shipments, falling back to the earliest delivery due date minus the customer's shipping lead time.
Added modifiedAfterUtc and modifiedBeforeUtc filters to Job List and Operation List for incremental polling of changed records.
Purchase Order Outside Processing Line Item Update now resyncs open outside-processing shipment quantities to follow the purchase-order line quantity when the update changes it, rather than leaving them at the job's total quantity.
Added netValueChange to inventory-event change details on Inventory Event Get and Inventory Event List. For stock takes it carries the true value delta of the adjustment, which the existing valuation buckets don't capture.
Fixed Job Tracking Get failing for jobs whose cost breakdowns contain legacy overhead rows; the cost-breakdown costType value set gained overhead and unknown. Also fixed componentLabor cost-breakdown lines reporting the material per-unit cost instead of the labor per-unit cost.
Added rework information to Job Operation List: isRework and hasAssociatedRework flags, plus a rework object with the reason, notes, quantities, and creator.
Corrected error status codes across the API: requests referencing records that don't exist now return HTTP 404, and business-rule validation failures return HTTP 400 with the reason in the response body — many of these cases previously returned HTTP 500.
Added Scrap Report endpoint returning scrap entries (item, quantity, value, operator, operation, work center, department, equipment, and job) over a date range.
Added Item Customer endpoints for managing customer-specific item data — customer item number and name, with read-only customer price breaks: Create, Update, List, and Delete.
Added item price-break endpoints: Sales Price Breaks List and Upsert for base, customer-specific, and customer-tier pricing (fixed unit price or margin), and Purchase Price Breaks List and Upsert for vendor costs. Upserts replace the matched price break's full set of quantity break points.
Added v2 Material Get, Material-Vendor List, Material-Vendor Create, and Material-Vendor Update endpoints that accept identifiers in the request body instead of the URL path. The original path-based endpoints are now marked obsolete; prefer the v2 variants when material identifiers may contain reserved URL characters such as /.
Added createdFromQuoteId to Sales Order Get and Sales Order List so consumers can resolve a sales order's originating quote without scanning the full quote list.
Removed operation references from cost-breakdown lines and timers. Cost breakdown lines now expose a flat referenceId and referenceName instead of a nested operation object. Affects all endpoints that return Cost Breakdown data.
Purchase Order Part Line Item Patch now bypasses status validation when only externalReferences, promiseDate, or receiveByDate are being modified, matching the existing behavior on the parent purchase order.
Dereferenced item and location on Inventory Transactions List. The transaction response now exposes the related item and location identifiers directly instead of through a nested reference object.
Removed the modifications field from MaterialShapeDto (affects Material List and Material Get). The field has been unpopulated since the v3 material schema rolled out; use type, spec, subspec, and finish instead.
Added discountAmount (calculated total) to discount line items on invoices, sales orders, and purchase orders. Affects Invoice, Sales Order, and Purchase Order endpoints that surface discount lines.
Added enableRemnantSync to Item Get and Item List so ProNest integrations can opt items in or out of remnant sync.
Reshaped the NCR DTO: split impact information into a dedicated impact object, expanded department into a full ReferenceDto with id, and added user-reference mappings. Existing fields remain available; consumers reading impact* fields directly should migrate to the nested impact object.
Added attachMaterialsToOperations toggle to Operation Create for Paperless Parts integrations that need to attach nestable materials to operations on creation.
Fixed quantity validation on invoice line item refunds — zero quantities now reject up front. Affects Invoice Line Item endpoints.
Replaced outsideProcessingTime with outsideProcessingCost on operation DTOs returned and accepted by Operation Create, Operation Get, and the operation entries inside item-routing endpoints. Consumers using outsideProcessingTime for outside-processing operations must migrate.
Added unit specifiers (widthUnit, heightUnit, lengthUnit, thicknessUnit) to Material Activate so metric and imperial materials can be created without ambiguity.
Added customerDetails to Item Get and Item List V2, and expanded vendorDetails to include price breaks. Set includeCustomerData=true on the list endpoint to opt in.
Added createdBeforeUtc, createdAfterUtc, modifiedBeforeUtc, and modifiedAfterUtc filters to Sales Order List.
Job Create now routes sales-order-based job creation through the full sales-order job-creation pipeline so all ancillary data is gathered correctly when supplying salesOrderId and salesOrderLineItemId.
Inventory Receive now accepts machineValue, laborValue, materialValue, and outsideProcessing valuations, and accepts either lotNumber or lotId (creating the lot if the supplied number doesn't exist).
Tightened Attachment Create and Remote Attachment Create to always treat attachments as Standard. The attachmentType field has been removed from the request — use the new certification endpoint for certification uploads. The accepted owner-type set has also been narrowed (e.g. InventoryLot is now reserved to certifications).
Added sourceType, relatedEntityType, and relatedEntityId as filter parameters for [Inventory Transactions List](/api-schema#tag/Inventory-Transactions/operation/
ListInventoryTransactions)
Added JobTracking Get for retrieving job progression and status information. This can be used to get a bird's-eye view of the job, including current operation(s), next operation(s) and estimates vs actuals so users have visibility into their shop floor.
Added Job Operation List for retrieving all operations for a job with related item to make and operation details.
Added OriginalScheduledStartUtc, OriginalScheduledEndUtc, ScheduledStartUtc and ScheduledEndUtc to all endpoints that return jobs. Affects Job List, Job Get and JobTracking Get
Added Item Routing Operation Batch for bulk applying operations to an item. Of note, this is geared towards nuance associated to continuous flow whereby operation order must be unique (no overlaps) but it can still be used if continuous flow is not enable. This will allow for bulk re-ordering operations, updating the existing operations where applicable, adding operations where they do not currently exist and removing no longer applicable operations.
Deprecated the status field in favour of statuses in the request body schema for [job List][api-schema#tag/Job/operation/ListJob] so that more than 1 job status can be filtered for at a time. status is Scheduled for removal EOD 2023-10-31.
Added the hasIncompleteOperations in the request body schema for [job List][api-schema#tag/Job/operation/ListJob] to filter for jobs with incomplete operations.
Deleted indicators added to Sales Order, Invoice and Purchase Order objects. While /list endpoints do not return deleted entities, you can still GET a deleted entity by it's Id. Having an indicator on the object will help your applications decide whether they can still make changes to that entity.
The Items List endpoint has been versioned. The new V2 Item List endpoint has a more robust item number matching options than the simple "contains" method of the original endpoint.