History
9/30/2026
- Fixed Quote Part Line Item Update and Sales Order Part Line Item Update clearing a line's item notes when
itemNoteswas omitted. An omitted, blank, or whitespace-onlyitemNotesnow keeps the line's effective notes (its own, otherwise its BOM's) and writes that value to both the line and its BOM, so these endpoints cannot clear notes. Lines created withoutitemNotesthrough Quote Create, Sales Order Create, and Sales Order Part Line Item Create take the item's routing notes, falling back to the item record's notes. Request and response shapes are unchanged.
9/29/2026
-
Added Department Shift Create, Update and Delete.
startTimeandendTimemust be 24-hourHHmm; eachavailableEquipment[].equipmentIdmust be equipment in the shift's department, listed once, andequipmentNameis filled from the equipment. Update replaces the whole shift exceptdepartmentId, which cannot change, so omitted fields are cleared. Update and Delete mark the latest schedule out of date; Delete answers204for a shift that does not exist or is already deleted. New endpoints — no existing behavior changes. -
Added Department Shift List and Get.
startTimeandendTimeare 24-hourHHmm;lengthOfShiftInMinutescounts an earlierendTimeas overnight and isnullwhen either time is invalid.availableEquipmentis ordered byequipmentId, case-sensitively. List filters onids,departmentIds(500 each) andname, sorts newest first unlessSort.Fieldnames a top-level field (others are a400), and omits deleted shifts, which Get returns withdeleted: true. New endpoints — no existing behavior changes.
9/28/2026
- Added Sales Order Part Line Item Full Routing Input Material Create, Update and Delete, editing the input materials on a sales order line's own routing without changing the item's routing. A routing holds each material once, and
routingStepIdmust be an operation on that routing; an update without it unlinks the operation. Edits repeat wherever the item recurs in the line's routing tree. The sales order must be Draft or Approved. They are not available to user-bound tokens. New endpoints — no existing behavior changes.
9/25/2026
- Changed Change Order Create to seed
impactedRecordsfrom every open document still carryingoriginalRevisionItem— a sales order or quote line with nodisposition, a complete job asFinish As Is, any other job asRevision— and to apply the account's default change order task template, with due dates counted from the UTC day ofrequestedUtc. An omittedrequestedUtcis stored as the account's current local day at UTC midnight. Seeding and the template apply happen only where change order updates are enabled; the request body is unchanged. - Added
sizeanddesignationto Tool Get, Tool Create and Tool Update: free text up to 100 and 200 characters on every tool type, longer is a400. OnlythreadPlugGage,threadRingGage,nptPlugGage,nptRingGage,plugGage,ringGage,setPlug,splineGageandattributeGagekeep them; a save clears them on the rest. Existing writes change: a save clearsmeasurementRangeMin,measurementRangeMaxand their precisions on those nine types and onfixture,machineandweldingEquipment, which also loseaccuracyandaccuracyPrecision. Update replaces the whole tool, so omittingsizeordesignationclears it. - Changed
searchon Tool List to also matchsizeanddesignation, whitespace-insensitively. A search that reads as a plain number (0.75) or as two numbers joined by a dash (0-6, in either order) also matches tools whosemeasurementRangeMin–measurementRangeMaxcovers it, but only on tool types that keep a range: never the nine gage types that keepsize, norfixture,machineorweldingEquipment. Results can only grow for a given search; request and response shapes are unchanged. - Added
itemIdto the line items returned by Receipt List whenincludeReceiptLinesis set: the part on a part line, and the item being processed on an outside-processing line.nullon a fee line or an outside-processing line with no item. Addition-only — existing payloads gain the field but no field changes. - Added
sourceto the rows returned by Inventory Transactions List:type,name,jobIdanditemToMakeId, ornullwhen no source was recorded.jobIdis set on every transaction a job owns — its picks and returns, including those against a work-order operation, and items it put into inventory — andnullotherwise. Addition-only.
9/24/2026
-
Added change orders: Change Order List, Get, Create, Update and Delete, carrying
number,customer,originalRevisionItem,newRevisionItem,status,requestedUtc,dueDateUtc,disposition,detailand read-onlyimpactedRecords, which list rows omit.originalRevisionItem.idis required. Update replaces the header and never writes the impacted records or the tasks. Deleting an applied change order is a400. Change order and task routes answer404until the surface is switched on for the account. New endpoints — no existing behavior changes. -
Added tasks as their own resource: Task List, Get, Create, Update and Delete. Every task belongs to the change order named by
relatedRecord, whoseidis required on create and ignored on update; update is a full replacement. Asequenceof 1 or more places the task at that step.completedByisnullon a completion made with an integration token,relatedRecordIdstakes at most 1000 ids, and tasks carry no modification stamp. New endpoints — no existing behavior changes.
9/22/2026
-
Corrected Item Vendor Update to record that it changed the vendor detail. The endpoint saved the new values but left the vendor's own modification timestamp untouched, and that timestamp is what the app reads to decide whether a quote or sales order line was priced from pricing that has since moved. A price changed through this endpoint therefore left every line priced from that vendor looking current, while the same edit made in the app flagged them. Request and response are unchanged, and the timestamp is not exposed on this API; what changes is that lines priced from a vendor updated here are now correctly reported as holding out-of-date pricing. Item Vendor Create does not set the timestamp, so a vendor added through the API still does not flag existing lines.
-
Corrected Vendor Patch. A patch document whose operations all target
/externalReferences, including thefromof amoveorcopy, no longer validates the vendor's other stored fields. A vendor holding aurlwithout a scheme (www.vendor.com) or an emptyvendorCodenow answers200to such a patch; previously the request answered400naming that field. A patch that names any other field, or has no operations, still validates the whole vendor, as before.
9/21/2026
-
Changed Customer Patch to validate
namewhen an operation names/name, as Customer Create and Customer Update already do. A patched name is trimmed and must be 1 to 200 characters, so a blank or whitespace-only one is now rejected with a400instead of being stored; a padded name is stored trimmed rather than as sent. Only an operation whosepathorfromresolves tonametriggers the check, however the pointer is spelled (name,/name/and//namecount as/name) — a patch touching other paths is unaffected, including on a customer whose stored name is already blank. Callers that patched blank names will start receiving the400. -
Corrected Customer Patch. A patch document with no operation under
/customFieldsno longer validates the customer's stored custom fields against the current definitions, so a customer holding a value for a deleted definition, or a legacy key, can again be patched onname,externalReferencesand the other fields; previously the request answered400naming that key. Operations under/customFieldsstill validate every key they carry, and a patch that does not name them leaves the stored values exactly as they were. -
Added
PUT /work-orders/{workOrderId}/operations/{workOrderOperationId}/nesting-setup, replacing a work-order operation's nest with theparts[],plates[]andunplacedParts[]sent. Parts and sheet placements link bypartNumber; two parts may not share one. The stored parts list is derived from the sheets, so the response carries the nest as stored, not an echo, plusvalidationIssues[], which never refuse the write. Server-owned fields the GET reports are ignored,nestingFileis kept, and anitemobject is accepted in place of itsitemId.scrapis not accepted. Emptypartsandplatesclear the nest; a nest with a completed sheet repetition, posted inventory or recorded scrap answers409. Not yet in the schema reference.
9/16/2026
- Added
quantityToMakeandquantityCompletedto the operations returned by Job Operation List, Job Item To Make Operation List, Get and Job Tracking.quantityCompletedis the higher of the count stamped when an operation completes and the running count operators bank while it is still in progress. Scrap does not reduce it, and it can exceedquantityToMake. On a continuous-flow routingquantityToMakeis the operation's current requirement, not a fixed plan — it is rewritten as the preceding operation banks parts. Both are read-only: Update ignores them. Addition-only — existing payloads gain the fields but no field changes. - Added NCR Create —
POST /ncrs, opening an NCR in status New and returning the same shape as NCR Get.typeanddetailare required;title,cause,reasonanddispositionare optional, anddispositionmust be one of the app's disposition values.jobIdand/oritemIdcreate the NCR's single impact: the job's customer and sales order are recorded from the job, anditemIddefaults to the job's parent item.quantityImpacted(zero or greater) requires one of them;quantityImpactedDispositionisAll,Partial(default) orUnknown, andAllreplaces the quantity with the job's quantity made. An unknownjobIdoritemIdis a 404. Requires Create NCR permission. New endpoint — no existing behavior changes. - Added CAPA Create —
POST /capas, takingcapaType(correctiveAction,preventiveAction,supplierIssue,safetyIssue),problemStatement, and optionalrootCauseAnalysisanddueDate, and returning the new CAPA'sid. The CAPA is created in the New status with no linked NCR, owner or tasks;dueDatedefaults to one month after creation. Requires Edit CAPA permission. New endpoint — no existing behavior changes.
9/15/2026
-
Changed Note Create to require permissions on user-bound tokens: View Sales Order, View Purchase Order, View Quote and View Invoice — all four, whatever
parentTypethe note targets, because the endpoint is polymorphic and the gate is static, so it cannot narrow to the parent actually sent. A user-bound token missing any one of them now gets403where the call previously succeeded. Tenant-bound tokens are not gated and are unaffected. -
Corrected
priceon Part Line Item Create Batch. A price sent for an item that carries a price break was replaced by the break's own price, so the line persisted at the item's catalogue figure and the response reported that figure rather than the one sent. The supplied price is now kept, and the line reportspriceSourceCustominstead ofItem. Two cases still price the line themselves and ignore a supplied value, as they do in the app: a margin-priced break, and a break with quantity breakpoints. An item with no price break was already honouring the sent price and is unchanged, as is the single-item Create, which appliespriceafter the line exists. A batch that sends nopricestill takes the item's price. -
Added
dueDateto Quote Get, Quote List, Quote Update and Quote Patch; Quote Create ignores it without an error. Update never clears it — an omitted ornullvalue keeps the stored date — so only a patch operation naming/dueDatewithnullclears one. Send the calendar date (2026-04-17); any time or UTC offset is ignored and the value is stored at midnight UTC. Update rejects a value outside 2000-01-01 to 2099-12-31 with400; patch does not range-check. A quote already Sent rejects the write. Addition-only — existing payloads gain the field but no field changes.
9/14/2026
- Changed Job Tracking Timer Start and Stop to accept operations grouped under a work order, which previously answered
400. Starting a timer on such an operation starts the work-order operation's timer, which covers every job operation grouped under it;userIdattributes it the same way it does a job timer, and a repeated start for the same user adds no timer. Stopping a work-order timer, or one of the per-job timers it holds, stops the whole work-order timer and every per-job timer under it. Those per-job timers list on Job Tracking Timer List withworkOrderIdnull, so they are not distinguishable there from plain job timers. On both endpoints auserIdortimerIdthat refers to a deleted record now answers404rather than being acted on. Operations not grouped under a work order are otherwise unaffected. - Added
salesOrderLineItemIdto the rows returned by Reporting Sales Order Lines List: the line item's own id, as returned by Sales Order Line Item List. It is not unique per row, and only that type-agnostic list resolves it, because this report also carries tax, fee, discount, shipping-charge and refund rows.salesOrderLinePrimaryKeyidentifies the report row rather than a line item; its description previously said otherwise. Addition-only — existing payloads gain the field but no field changes. - Added
POST /work-orders, creating a work order from job operations. Sendoperations[](1–50), each withjobOperations[]ofjobIdandjobOperationId(500 across the request) and optionaladditionalInstructions,estimatedSetupTimeSecondsandestimatedRunTimeSeconds; the work order takes optionalname,status,priorityandproductionDueDateUtc.statusdefaults toneedsReviewand acceptsneedsRevieworapproved;prioritydefaults tomoderate. A job operation already on a work order answers409naming that work order. Returns the newid. Not yet in the schema reference. - Changed
salesOrderModifiedUtcon Reporting Sales Order Lines List to serialize with a trailingZ(2026-09-14T09:24:32.5574251Z), as the other UTC timestamps on this API do. The instant is unchanged — it was always UTC, as the field name and description say — only the offset marker is new. A consumer that already treated it as UTC sees no difference; one that parsed it as local time was reading it wrong and will now read it right. Sending a previously received value back asmodifiedAfterUtc, with or without theZ, continues to work.
9/13/2026
- Corrected
subtotalon Invoice Get, Invoice List, Invoice Update and Invoice Patch. It is the sum of the line items the invoice bills, in primary currency, before tax, the discount, the deposit and progress-billing adjustments, and any refund — a deposit invoice reports its deposit lines. Integrations keying onsubtotalwill see it rise by the discount. - Corrected
subtotalon Sales Order Get, Sales Order List, Sales Order Update and Sales Order Patch. It is the sum of the line items the order bills, before tax, the discount and any refund; child lines of a blanket-order line are excluded. Integrations keying onsubtotalwill see it rise.
9/11/2026
- Made Attachment List available to custom pages. A user-bound token sees only attachments whose owner entity it holds view permission for — the rows are excluded in the query itself, ahead of
skip/limit, so a page fills completely — and an owner it may not view yields200with an empty list rather than403. Owner types the permission map does not cover are never returned to a user-bound caller. Tenant-bound API keys are unaffected. - Fixed Attachment List paging:
sort(by default, name ascending) now decides which attachments fall on each page. Previously each page was cut from the matching attachments in no defined order and only then sorted, so paging through a list could repeat or skip attachments. - Changed Item Routing Input Item Create, Item Routing Input Item Create Batch and Item Routing Operation Item Create to answer
400when a newly added input item is the item itself, another revision sharing its routing, or an item that consumes any of those, directly or through intermediate items — a circular bill of materials. The message names each item in the loop; nothing is written. Lines the routing already carries are not re-checked. Callers that made such writes now receive the400. - Added Quote PDF —
GET /quotes/{quoteId}/pdf, returningapplication/pdfasQuote_{number}.pdf, orQuote_{number}_{revision}.pdffor a quote carrying a revision letter. The PDF reflects the quote's current state and the tenant's PDFs & Emails settings at the time of the request; it is not a previously generated or emailed copy. Requires View Quote permission. Returns 404 if the quote does not exist or has been deleted — unlike Quote Get, which still returns a deleted quote. New endpoint — no existing behavior changes.
9/10/2026
- Changed the
emailrule on customer contacts. Customer Contact Create and Update, and thecontactblock on Quote Create and Sales Order Create, now accept only a single well-formed mailbox address: an ASCII local part, one@, and a domain with at least two labels. Display names, angle brackets, quotes, embedded whitespace, comments, IP literals and non-ASCII characters are rejected with the same400andEmailmodel-state message as before. Strings are still trimmed on the way in, so surrounding whitespace is dropped and a blankemailis treated as omitted, the same asnull. Previously anything with one@and text on both sides was stored, so a payload sendingName <[email protected]>or a dotless domain will start failing. - Changed how Tools List filters treat reference gages (tools with calibration frequency None), as part of introducing in-house verifications for them.
calibrationStatusesnow matches every tool on its active track: a scheduled tool on its latest calibration, a reference gage on its latest verification — so a gage with no verifications now matchesnotApplicable, where before it matched no status at all.referenceis now AND-combined with the other filters (it narrows to gages) instead of OR-adding gages to the status results. The due-window filters (isOverdue,due7Days,due30Days,dueWithinDays) now also match a cadenced reference gage on its verification due date; a gage with no cadence has no due date and still never matches. Tool responses gain read-onlyverificationFrequency,verificationInterval,lastVerificationDateUtcandnextVerificationDateUtc. Verification records themselves are not exposed on the public API: tool-calibration list/get/update serve calibrations only. - Added inclusive whole-day date-range filters to ten list endpoints. Every bound is optional and applies on its own, and a bound outside 2000–2099 is rejected with a
400. Addition-only — existing requests are unaffected.- Plain calendar dates, used exactly as entered:
orderDateFrom/orderDateToon Purchase Order List;productionDueDateFrom/Toon Job List;quotedDateFrom/Toon Quote List;nextCalibrationDateFrom/Toon Tool List. A quote that was dated by sending it carries the send moment, so it is filtered on the UTC calendar. - Shop-timezone days, so a record stamped at 6pm on the last of the month falls in that month:
completedOnFrom/Toon Job List and Work Order List;actionDateFrom/Toon Inventory Event List;createdFrom/createdToon CAPA List and NCR List. issueDateFrom/issueDateToon Invoice List split by how the date was set: a date you typed is used as entered, and a date stamped by sending the invoice is read as a shop day — the same split the month-end accounting report uses.stoppedFrom/stoppedToon Reporting Time Clock List are UTC days, like thestartedFrom/startedTobeside them. An entry that has not been stopped never matches.- On CAPA List and NCR List the existing
createdUtcfilter is unchanged and combines with the new pair rather than being replaced by it. UsecreatedFromto ask for a day andcreatedUtcto resume from an instant.
- Plain calendar dates, used exactly as entered:
- Corrected
numberon Receipt Get, Receipt Update and Receipt Patch. It counted an order's uncommitted receiving batch, so a committed receipt could report one higher, and the same receipt could report different numbers on two reads. All three now count committed receipts only, matching Receipt List — which in turn no longer renumbers whenreceiptIdsnarrows the result. An uncommitted batch fetched by id reports0rather than1. Integrations keying documents onnumbermay see it fall by one. - Added
customerTypeIdandcustomerTypeNameto the customer returned by Customer Get and Customer List. Both are read-only — the type is assigned in the app: Customer Create and Update ignore them, and neither is a valid Patch path. A customer with no type carriesnullin both. Addition-only — existing payloads gain the fields but no field changes. - Changed Reporting Sales Order Lines List to answer
400whensalesOrderStatusis not one of the status labels the rows carry —Draft,Needs Approval,Approved,In Progress,Complete, compared ignoring case. Previously any other value, including the camelCase enum names the sales-order endpoints use such asinProgress, matched nothing and returned an empty page that looked like a real answer. The error names the field and lists the accepted values. Requests that already send a valid label are unaffected. - Added Nesting Work Package Manifest —
POST /nesting/work-package-manifest, the cut list for 1–500 job operations sent asjobOperations[]ofjobId,jobOperationIdand optionalitemToMakeId(an operation id can repeat within a job). Each part carries quantity, dates, material anddrawings[]— attachment ids forGET /attachments/{attachmentId}/download, withisOperationSpecificandownerType(itemdrawings need View Item on user-bound tokens); an operation-tagged drawing hides item-level ones.material.nameis always present;materialNameandgradeare null unless the material master carries them. Unresolved entries return inskippedasnotFound,ambiguousJobOperation(resend withitemToMakeId) ornoSystemOperation.
9/9/2026
- Changed the redirect that Attachment Download returns for a file over 20 MB: the signed storage URL now carries a
Content-Typefor a recognised extension (application/pdffor a.pdf; an unrecognised extension such as.SLDPRTcarries none and storage serves the type stored on the file), and itsContent-Dispositionis signed per request rather than read from a header stored on the file. Previously both headers were whatever the last in-app preview or download had written onto the blob, so a consumer could receiveapplication/octet-streamfor a PDF, or a disposition left behind by another caller. Files of 20 MB or less are still streamed directly with the same file name and type as before. Response status and shape are unchanged. - Added
receivedDateFromandreceivedDateTofilters to Receipt List. Both are inclusive whole days in the shop's timezone and apply to the receipt's effective received date (the override when one is set, otherwise the recorded date). Either bound may be sent alone; a time of day is ignored. Addition-only. - Added
unitPriceandlineItemType(part,outsideProcessingorfee) to the line items returned by Receipt List whenincludeReceiptLinesis set.unitPriceis per Fulcrum's unit of measure, so it multiplies withconvertedQuantityReceived, and is discounted where the line carries a discount.nullmeans there is no price (a sales-order receipt, an unresolvable line, or a fee ordered without a quantity), never zero. Addition-only. - Corrected sorting and paging on Receipt List: the page was cut before the sort was applied, so
skip/takewalked an arbitrary order. The whole result is now sorted first, withidbreaking ties, and an unknownsort.fieldfalls back toorderIdinstead of failing. - Corrected Receipt List:
purchaseOrderIdscombined with any other filter also returned sales-order receipts, andsalesOrderIdslikewise returned purchase-order receipts. Only the side named is searched now; naming neither still searches both. - Changed
qtyCompletedThisRunon Reporting Job Activity By Operator List to credit an entry to the day of the operator's timer it was logged during, so a count logged after midnight UTC stays with the shift that made it, and to keep an entry that matches no timer as a row of its own where the operator ran no timer that day, instead of omitting it. Each inventory entry counts on one operation rather than on every operation of its item. Rows can appear or move between days; shapes are unchanged. - Corrected
shippedDateOverrideon Shipment Update and Shipment Patch: it is now persisted and returned, and takes precedence overshippedDatewherever a ship date is reported. Update is a full overwrite: omitting the field or sendingnullclears it, so an integration that updates shipments without it clears a date set in the app. On patch, only an operation naming/shippedDateOverridechanges it. Send midnight UTC (2014-10-23T00:00:00Z); the value is stored as sent and reports compare it as a date. On update, a value outside 2000-01-01 to 2099-12-31 is rejected with400; patch does not range-check.shippedDateandshippingCostremain accepted but not applied. - Added a
modifiedAfterUtcfilter and asalesOrderModifiedUtcfield to Reporting Sales Order Lines List, so a sync can pull only what changed. The bound is exclusive and compares the full date and time, not the calendar day like the endpoint's other date bounds — send back the largestsalesOrderModifiedUtcyou hold to get exactly what moved after it. The stamp is order-grain: any save of the order returns all its lines; job and shipment-header changes do not move it. Addition-only — existing payloads gain the field but no field changes.
9/8/2026
- Added
shipmentas an attachment owner type. Attachment List and Attachments Download acceptowner/ownersentries of{ "type": "shipment", "id": <shipmentId> }, where<shipmentId>is theidreturned by Shipment List; shipment-owned rows come back withowner.typeshipment, and Attachment Get and Attachment Download return them. Create Attachment and Create Remote Attachment acceptShipmentas the owner type, rejecting an unknown shipment id with a 400. On Attachment Get and Attachment Download, a user-bound token must hold View Shipments to read a shipment-owned attachment. Addition-only — existing owner types are unchanged. - Added
customerItemNumberto the rows returned by Reporting Shipping List. It carries the customer's part number from the shipment line's source sales-order line; a line fulfilling outside processing carriesnull. Addition-only — existing payloads gain the field; no existing fields change. - Added Job Message List (
POST /jobs/{jobId}/messages/list) and Job Message Create (POST /jobs/{jobId}/messages) over the job's chat. SenditemToMakeIdandoperationIdtogether to address one operation's chat; one without the other is a 400. The list is paged byskip/take, fixed tocreatedUtcdescending (asortis a 400); a job with no chat yet returns an empty page. Create takesbodyand optionalmentions— each must be a user id, and mentioned users are subscribed to the chat — and returns the new messageid. Addition-only. - Added
jobReferencesto the purchase order, returned by Purchase Order Get, Create, Update and Patch. Each entry carriesid,numberandname, and reports a job once however many times the order references it. A purchase order reaches a job three ways — associated with the order itself, allocated to one of its part lines, or ordered through an outside-processing line — and only the third was previously visible, on Outside Processing Line Items List. All three are now reported together, so "which jobs is this order for" is one read rather than a walk of the line items that could only ever answer for outside processing.namefalls back to the job's number when the job is unnamed, matching what the purchase order screen shows. Addition-only — existing payloads gain the field but no field changes. - Added
jobIdsto purchase order part line items, returned by Part Line Items List, Get, Update and Patch — the jobs a line's material is allocated to, at line grain rather than the order grain ofjobReferences. A line with no allocation returns an empty array, never null. The allocated quantity is deliberately not reported: it is not populated on every path that creates an allocation, so a number here would read as zero against material that is genuinely allocated. Addition-only — existing payloads gain the field but no field changes. - Added a
jobIdfilter to Purchase Order List, matching orders associated with that job by any of the three routes above. Answers the reverse question — what has been ordered for this job — without pulling orders and discarding most of them, and narrows the query itself rather than just the response. Combines with every existing filter. A job that no order references returns an empty list. Addition-only — existing requests are unaffected. - Fixed every JSON Patch endpoint failing with a server error when the request names a path the endpoint does not have — for example
/materialDetails/uniton Item Patch. Such a request is now rejected with a 400 whose message names the segment that was not found, so it can be corrected from the response alone. The other ways a patch body can be malformed answer 400 the same way: an operation the endpoint does not support, and a value the target field cannot hold. A failed RFC 6902testoperation also answers 400 rather than 500 — it is a state-conflict probe rather than a malformed document, so treat that 400 as retriable after refetching the record. This covers every patch endpoint — Quote, Sales Order, Purchase Order, Invoice, the part, fee, blanket, refund, vendor-credit, and outside-processing line-item patches on sales orders, purchase orders and invoices, and the patches for items, jobs, customers, vendors, shipments, receipts and receipt line items, timers, tags, and inventory-event details. Consumers that detect these failures by matching on 500 will now see 400; patches naming valid paths are unaffected. - Added Nesting Nestable Jobs List —
POST /nesting/nestable-jobs/list, a paged list of nestable groups: a material shape paired with the operation it is cut on, with the job operations still waiting to be nested and the work-order operations already created. Filter onneedNesting,existingNests,materialForms,operationIds,materialShapeIds,earliestStartOnOrBeforeandsearch.earliestStartOnOrBeforeis a day-inclusive calendar date (YYYY-MM-DD; a valid time or offset is ignored) and drops groups with no dated job operation, so existing-nest-only groups never survive it. New endpoint — no existing behavior changes. - Added Work Order Operation Nesting Setup —
GET /work-orders/{workOrderId}/operations/{workOrderOperationId}/nesting-setup, returning the nest planned onto one work-order operation: its parts, the sheets it cuts them from withcompletedCountagainstcount, and the parts it could not place. An operation with no nest answers200withisNestedfalse,machineTimeSeconds0and empty lists. Returns404if the work order does not exist or has been deleted, or has no operation with that id. New endpoint — no existing behavior changes.
9/5/2026
- Corrected how
externalReferencesentries render on read and how PATCH writes them.externalIdnow returnsnullwhen the record holds no value (it returned"") on customers, items, quotes, sales orders, purchase orders, inventory event details, vendors and timers. On customers and sales orders,type,displayId,statusandurlnow return""when the record holds an empty string (they returnednull). On customers, items, quotes, sales orders and purchase orders, a PATCH now stores a blank member as"", including on an entry the request never mentioned — both previously becamenull. POST and PUT are unchanged: a blank member is stored as no value, and a blankexternalIdis still rejected as required. Invoices, receipts and shipments are unchanged. A consumer that treatsnulland""alike sees no difference.
9/2/2026
- Changed
qtyCompletedThisRunon Reporting Job Activity By Operator List to net a day's negative entries instead of dropping them, so a day can read lower than it reported, negative, or zero;unitsPerHourmoves with it. The run close-out now stands in only for an operation with no non-zero entries. Deleted job-log entries no longer count here or inqtyInventoriedThisRun. A day whose entries net to zero, previously omitted, now returns a row, so totals and paging can change. - Changed the rows printed by Purchase Order PDF. When the tenant has line consolidation enabled in their PDFs & Emails settings, stored part lines that agree on item, unit price after discount, expected receive date, and the item's custom unit-of-measure multiplier print as a single row carrying their summed quantity, the sum of their subtotals, and each stored line's number in the
#column — so the document can show fewer rows than the order holds. Two lines both without an expected receive date count as agreeing. Outside processing lines consolidate on item, price, and expected receive date; vendor credit and fee lines never merge. The order's stored lines and its totals are unchanged. The setting is off by default, so an integration on a tenant that has not enabled it sees the same document as before.
9/1/2026
- Changed item writes to require an inventory unit of measure. An item has always been meant to carry one, but several paths let an item reach the database without it, and downstream inventory, costing, and purchasing then had no unit to work in. Item Update, Item Patch, the item tag endpoints (
POSTandDELETE /items/{itemId}/tags/{tagId},PUT /items/{itemId}/tags), and Item Add Revision now answer400when the item they target has no inventory unit of measure, rather than writing or cloning an item that cannot be stocked. Item Create is unchanged:unitOfMeasureNamewas already required there. Set the unit on the item first, through Item Update or in the app, and the call succeeds. Only items already stored without a unit are affected, so an integration whose items all carry one sees no change. - Changed how Create Attachment classifies an uploaded PDF. A 3D PDF — a
.pdfwhose bytes carry a PRC 3D-annotation stream — is now recognized as a CAD file, so it is processed for the in-house 3D viewer and receives a rendered thumbnail, the same as any other CAD upload. A plain 2D PDF is unchanged: it stays on the document path with its usual thumbnail. The distinction is drawn from the file's contents, not its extension or the request — nothing in the request selects it, and no other file type is affected. A PDF that is not a 3D PDF, and every non-PDF upload, behaves exactly as before.
8/31/2026
- Added
unitOfMeasureNameto Item Update and Item Patch, so a stocking unit picked wrongly at create time can be corrected without a trip into the app. Omitting the field — or sendingnull— keeps the item's current unit, the same waynumberandexternalReferencesbehave; every other field on the update remains an unconditional overwrite. The unit must belong to the item's existing unit type: aPiecesitem acceptsPiece,SetorCase, and anything else is a 400 naming the item's unit type and the units it will accept. The unit type itself stays create-only, here and in the app — an item created under the wrong unit type has to be recreated. A change is only accepted while nothing still depends on the current unit, because nothing is converted when it changes: on-hand quantities are stored as bare numbers, a sales unit of measure conversion is a ratio against the current unit, and a price break that names an amount — item, vendor, customer, or customer-tier — is a price against a unit of the item's. A break holding only a margin or a markup is a percentage, so it survives the change and does not block it; creating an item seeds exactly one of those from the shop's default margin, which is why a freshly created item can still be corrected. So a change is rejected with a 400 when the item is in use by a quote, sales order, purchase order, job, invoice or another item's routing; when it holds inventory on hand; when the request sends sales unit of measure conversions alongside the change; or when any of its price breaks carries a price. Each 400 names which of those blocked it. Past inventory transactions are not checked and are not converted: an item whose on-hand has returned to zero may change its unit — the same as correcting it in the app — and its earlier transaction rows are then read in the new unit. Clear the blocker in one request, then change the unit in a second — each condition is read as the item stands before the update, so doing both at once is still rejected. The one exception issalesUnitOfMeasureConversions: because an update replaces them wholesale, a request that changes the unit and sends none is accepted and leaves none behind, while a request that changes the unit while conversions are present — sent on the update, or carried forward from the item by a patch — is rejected. An item with no unit type recorded is also rejected, and its unit cannot be corrected through this endpoint at all. Sending the unit the item already has is not treated as a change, so a read-modify-write integration that echoes the field back keeps working on items in any of those states. - Changed
nextCalibrationDateUtcon Tool List and Tool Get: a tool that is inactive with reasonretiredorlostnow returnsnull— it is permanently out of service, so nothing is ever due against it, the same as a tool withcalibrationFrequencynone. Other inactive reasons still return the computed date.lastCalibrationDateUtcand the tool's calibration records are unchanged, and clearing the reason restores the date. Consumers deriving due lists from this field will seeretired/losttools drop out; request and response shapes are unchanged.
8/28/2026
- Added a
salesOrderNumbersfilter to Reporting Sales Order Lines List, matching lines by the sales-order number shown in the product. A consumer tracking a known set of orders can ask for exactly those orders in one call instead of pulling a broad date or status slice and discarding most of it — which also narrows the query itself, not just the response. Accepts up to 500 numbers, matched exactly; duplicates are ignored, and sending an empty list (or omitting the field) returns unfiltered results as before. A longer list is rejected rather than trimmed, so a request can never quietly match fewer orders than it asked for. Combines with every existing filter. Addition-only — existing requests are unaffected. - Corrected the published response for Sales Order PDF —
GET /sales-orders/{salesOrderId}/pdfnow declares its200asapplication/pdfbinary content in the OpenAPI schema, matching Purchase Order PDF. Generated clients that previously typed the response as empty will now type it as a binary download. The bytes on the wire are unchanged. - Added Sales Order PDF —
GET /sales-orders/{salesOrderId}/pdf, returningapplication/pdfasSalesOrder_{number}.pdf. The PDF reflects the order's current state and the tenant's PDFs & Emails settings at the time of the request; it is not a previously generated or emailed copy. Requires View Sales Order permission. Returns 404 if the sales order does not exist or has been soft-deleted — unlike the in-app preview, which still renders a deleted order. New endpoint — no existing behavior changes. - Added Invoice PDF —
GET /invoices/{invoiceId}/pdf, returningapplication/pdfasINV{number}.pdf. The PDF reflects the invoice's current state and the tenant's PDFs & Emails settings at the time of the request; it is not a previously generated or emailed copy. Date formatting is presentational and may vary by environment. Requires View Invoices permission. Returns 404 if the invoice does not exist or has been soft-deleted. New endpoint — no existing behavior changes. - Added Shipment PDF —
GET /shipments/{shipmentId}/pdf, returning the shipment's packing slip asapplication/pdf. The file name is based on the order fulfilled by the shipment and the shipment's sequence number, rather than the requested shipment ID. For example,SO1862-2.pdffor a shipment fulfilling a sales order andPO104-1.pdffor outside processing. The PDF is available in every status, including for shipments that have been cancelled. Requires View Shipments permission. Returns 404 if the shipment or the order it fulfils does not exist or has been deleted. New endpoint — no existing behavior changes.
8/27/2026
- Changed
qtyCompletedThisRunon Reporting Job Activity By Operator List to report what each operator reported, rather than the operation's run total. Completing an operation records that total against whoever closed it, and it previously replaced that operator's own reported quantity — on a run finished by one of several operators, the whole run was credited to the closer. Where anyone reported quantity on an operation, each operator is now credited only with what they reported; a close-out still stands in where nobody reported individually and it is the sole record. Per-operator quantities on such an operation fall, and need not sum tounitsCompletedOnOperation.unitsPerHouris derived from this field and moves with it. Request and response shapes are unchanged.
8/26/2026
- Added Purchase Order PDF —
GET /purchase-orders/{purchaseOrderId}/pdf, returningapplication/pdf. The file name is based on the tenant's purchase-order title template, withPurchase Orderabbreviated toPOand spaces removed. For example, the default template producesPO104.pdffor an ordered purchase order andRFQ104.pdfwhile it is still a draft. The same purchase order may therefore have a different file name as its status changes. Requires View Purchase Order permission. Returns 404 if the purchase order does not exist or has been soft-deleted. New endpoint — no existing behavior changes.
8/25/2026
- Changed
quantityShippedon Shipment Line Items List to report what a line actually shipped: its packed quantity once the parent shipment has shipped, and0before then. It previously derived from the line'spackingStatus, which is a separate value an operator can pin by hand and which shipping does not clear — so a shipped line whose packing status readNotPackedreported0even though its packed quantity went out and was invoiced, while a line packed on a shipment that had not yet shipped reported that quantity as already shipped. Consumers summing this field will see shipped totals rise where the first case applied and fall where the second did.quantityPacked,packingStatus, andshipmentStatusare unchanged, and the field now agrees with the shipped quantity reported by Reporting Shipping List. - Added
salesOrderLinePrimaryKeyto Reporting Sales Order Lines List rows — an opaque identifier unique to each row, stable within and across pages, for joining rows back to a line. The line-item number is not unique. Addition-only — existing payloads gain the field but no field changes.
8/24/2026
- Added
dropshipanddropshipCustomerPoNumberto the sales order. Returned by Sales Order Get and Sales Order List, and accepted by Sales Order Create, Update, and Patch.dropshipmarks the order as fulfilled by shipping directly to the end customer — the same flag as the in-app Dropship toggle on the deliverables timeline — anddropshipCustomerPoNumbercarries the end customer's purchase order number, which prints on dropship paperwork and labels. On create,dropshipdefaults to false when omitted. On update the two fields move together and are written only whendropshipis supplied: omitdropshipand neither field changes, so an existing integration that keeps PUTting its current payload never turns dropshipping off and never clears a PO number authored in the app. Sendingdropshipwith nodropshipCustomerPoNumberclears the PO number — that is the only way to clear it, since a blank string is coerced to null before validation rather than acting as a clear-this-field sentinel. Note the asymmetry:dropshipCustomerPoNumberdoes not follow the replace-on-PUT behavior ofcustomerPoNumberandpublicNote, which are cleared by omission. Addition-only — existing payloads gain both fields but no field changes.
8/23/2026
- Added
isLotTrackedandisNonInventoryto Item Update, andisNonInventoryto Item Create. Both values were already returned by item reads, andisLotTrackedwas already settable at create time, so until now neither could be corrected on an existing item. Likenumber, both are opt-in on update: omitting a field (or sendingnull) keeps the item's current value, so an update that does not mention them cannot change them, and a value that matches the item's current one changes nothing.isNonInventoryalso keeps the item's inventoried state in step, since a non-inventory item is never held in inventory. Only a buy item that is not sellable can be non-inventory. On create, anything else is rejected with a 400. On update the same 400 applies to turning it on, while an item that is already non-inventory can restate that value — so a read-modify-write update of a legacy item that is already in that state does not start failing. Addition-only: requests that omit the new fields behave exactly as before. - Added Item Material Create —
POST items/material— for creating an item from a material shape. This is how a material item's thickness, form and length unit become settable through the API: they are not request fields, they come from the shape selected, along with the density used to calculate the item's weight, so pick the shape carrying the combination you want. The request names the shape (materialShapeId) and only the dimensions that vary:lengthfor every shape, pluswidthfor planar shapes (sheet, plate, tread plate). A planar shape sent withoutwidth, or a linear shape (bar, tube, pipe, beam, angle, channel) sent with one, is rejected with a 400 rather than defaulted or ignored. Items are created as Buy items measured in Pieces and take the shop's default buy-item accounting code, except a remnant (isRemnanttrue), which is created with none. The shape must already be activated for the shop: an id that exists only in the materials database returns a 404 pointing at Material Activate, which this endpoint deliberately does not call for you because activating a shape also un-archives every existing non-remnant item that uses it. Worth planning for: a material item's number is derived from the shape and dimensions rather than supplied, so posting the same shape and dimensions twice returns the id of the item that already exists, un-archiving it if it was archived, instead of creating a duplicate. The number does not encode remnant state, soisRemnantapplies only when a new item is created and is ignored on that collision — the item you get back keeps the remnant state it already had.materialDetailson the item read and update endpoints is unchanged and stays read-only.
8/21/2026
- Added a shipped-date window to Reporting Shipping List:
shippedDateFrom/shippedDateTo, bounding the date a shipment actually shipped — its ship-date override when set, else its recorded ship date. Distinct from the existingshipByDatebounds, which filter the date it was due to ship. Both bounds are day-inclusive, covering the wholetoday whatever time a shipment went out, and match only shipments whose status is Shipped — an override can be set while a shipment is still open. Addition-only — existing requests are unaffected.
8/20/2026
- Added shipped-date and invoiced-date windows to Reporting Sales Order Lines List:
shippedDateFrom/shippedDateTo,invoicedDateFrom/invoicedDateTo, and the dates they filter on —firstShippedDate,lastShippedDate,firstInvoicedDate,lastInvoicedDate— on every row. A line ships and is invoiced in tranches, so a bound pair selects lines whose activity span overlaps the window rather than only those wholly inside it; a line with no such activity carries nulls and is excluded by any bound on it. Bounds are day-inclusive. Addition-only — existing payloads gain the fields but no field changes. - Changed paging on Reporting Sales Order Lines List to a total order. Lines tying on every sort key — same ordered date, order number, line item, and unit price — previously ordered arbitrarily, so one could repeat on the next page or be skipped altogether. A unique line key now breaks those ties. Filters and row shapes are unchanged, but a caller paging the same query may see tied lines fall on different pages than before.
8/19/2026
- Added
requiredQuantityLbs,collectedQuantityLbs, andoutstandingQuantityLbsto Material Requirements Report rows — the existing kilogram quantities converted to pounds. Populated whereverrequiredUnitOfMeasureiskg— always the case for material requirements, and also for an item requirement whose item is stocked by weight;nullfor quantities in any other unit, where a weight conversion would be meaningless, andnullwherever the kilogram value is itselfnull(an unresolved nest weight stays unknown rather than becoming zero). The kilogram fields are unchanged. Addition-only. - Added Item Purchase History — returns every purchase of one item within a date window, newest first. Each entry carries the purchase order, vendor, ordered unit price, billed unit price,
effectiveUnitPrice(the billed price when present, otherwise the ordered price), and quantities ordered and received. Includes a summary with min/max/average price, last price paid, last order date, and distinct vendor count. Counts only orders with statusOrderedorPaid.monthsdefaults to 12 and is clamped to 1–60. Not paginated — bounded by one item and the window. - Documented
itemOriginon Item Create. Usebuy,make,makeOrBuyorcustomerSupplied; the schema also carrieskitandnonefor historical reasons, and while both are accepted neither is supported for new items. No behavior change — the field has always accepted every value in its schema. To spell out the one that was hardest to discover: a customer-supplied item is created by sendingitemOrigin: "customerSupplied".itemOriginremains create-only, so an existing item's origin cannot be changed through the API — an item created with the wrong origin has to be replaced rather than converted.
8/18/2026
- Added
reasonto Scrap Report entries — a reference (id,name) to the reason selected when the scrap was recorded, ornullwhen the entry carries none. The reason has always been captured with the entry and shown in the product; the report endpoint now returns it, so a consumer grouping scrap by cause no longer needs the Excel download. Addition-only — existing payloads gain the field but no field changes. - Fixed Item List failing with a server error whenever the
descriptionFilterfilter was supplied — the filter now runs in the database. An item matches when its description contains the supplied text, compared case-insensitively, and the filter narrows results alongside any other filter sent with it. Separately, the documented syntax for this field was wrong on both v1 and v2: it described quoted phrases for exact matching and a leading-to exclude a term, neither of which is implemented — v2 has matched on a plain case-insensitive substring since it was repaired, and v1 now does the same. Both field descriptions have been corrected; no v2 behavior changes. - Changed the due-window filters on Tool List:
isOverdue,dueWithin7Days, anddueWithin30Daysno longer match out-of-service tools — tools that are inactive with any reason other thanOutForCalibration:Lost,Damaged,RequiresRepair,Retired, or a legacy row with no recorded reason. Such a tool no longer needs calibration, so it no longer counts as due or overdue. A tool that is inactive with reasonOutForCalibrationstill matches, because it is inactive only while it is being calibrated. This matches the in-app Calibration Overdue / Due 7 Days / Due 30 Days KPIs, which now exclude the same tools. Request and response shapes are unchanged — only the filtered row set changes.
8/17/2026
- Added
measurementRangeMinPrecisionandmeasurementRangeMaxPrecisionto tools — the number of decimal places each measurement-range bound was entered with, matching the existingaccuracyPrecision. A range entered as 0.1000–0.4000 now keeps its trailing zeros on the tool and on generated calibration certificates instead of collapsing to 0.1–0.4. Returned by Tool Get (and echoed by the create/update responses), and accepted by Tool Create and Tool Update. Omitted ornullmeans no precision was recorded, and the values render at their natural precision as before. Addition-only — existing payloads gain the fields but no field changes.
8/14/2026
- Added progress-billing line items to invoice reads: Invoice Get and Invoice List now return two new line-item
typevalues,ProgressBilling(an installment invoice's percentage-of-order charge) andProgressBillingAdjustment(the final invoice's reversal of one already-billed installment). Both carryquantity1, the line's amount inpriceanddiscountedPrice, the line's accounting code, andisTaxablefalse. Addition-only for existing consumers: these lines exist only on invoices generated from a progress-billing schedule, and invoices without one are unchanged. - Added
needsQualityPlanto item reads — a boolean indicating whether the item requires an approved quality plan. Combined with the existingqualityPlanStatus, a consumer can distinguish an item that has an approved plan (needsQualityPlantrueandqualityPlanStatusApproved) from one that needs no plan at all (needsQualityPlanfalse), which the status alone could not express. Returned by Item Get, Item List (including its v2), Item Update, and Item Patch. Read-only — returned on these reads and mutation responses but not settable on create/update. Addition-only — existing payloads gain the field but no field changes.
8/12/2026
- Added a
namesfilter to Shipment List, matching shipments by the shipment number shown in the product (e.g.SHP-SO1234-1,SHP-PO5678-2). Resolving a shipment from a number previously meant looking up the parent sales or purchase order and walking its shipments; a number now resolves in a single call. Accepts up to 500 names, matched exactly and case-insensitively; sending an empty list (or omitting the field) returns unfiltered results as before. Addition-only — existing requests are unaffected.
8/11/2026
- Fixed Receipt List failing with a server error whenever the
externalReferencefilter was supplied — the filter now runs in the database, for both purchase-order and sales-order receipts. Filter semantics are unchanged: a receipt matches when it carries the named external-reference key and, wheretypeorexternalIdare also supplied, that same entry matches them. - Fixed Item List failing with a server error whenever the
customFieldfilter was supplied — the filter now runs in the database. An item matches when one of its custom fields is exactly the requestedkey:valuepair, compared case-insensitively; partial key or value fragments do not match.
8/10/2026
- Added
onFairto the full-routing in-process-tracking endpoints — get, list, and create for jobs, quotes, and sales-order part line items. It marks a checkpoint as reported on the First Article Inspection Report (FAIR), a meaning that until now was carried byfirstArticle. The two are independent from here on:firstArticleremains the sampling instruction (it still resolves an unsupplied frequency to 0), whileonFairgoverns FAIR membership only and never affects sampling.onFairdefaults to false on create, so an integration that wants a checkpoint reported on the FAIR must set it explicitly —firstArticle: trueon its own no longer implies FAIR membership. Reads are addition-only: existing payloads gain the field but no field changes.
8/7/2026
- Fixed Time Clock List failing with a server error whenever
startedDateRangeorstoppedDateRangewas supplied — the range filters now run in the database. Filter semantics are unchanged: a still-running entry (no stop time) is treated as unbounded, so it matches anystoppedDateRange.startand is excluded by anystoppedDateRange.end.
8/6/2026
- Fixed Purchase Order Get and List returning a spurious
contactIdfor purchase orders that have no contact — the field now readsnullfor contactless purchase orders, and the schema declares it nullable. Purchase orders with a real contact are unaffected; consumers that assumed the field always holds a value should treat it as optional. - Fixed Purchase Order Outside Processing Line Item Create failing with a server error when the targeted job operation carried no item reference or no linked system operation — the line item is now created from the fields that are present, and outside-processing line-item reads return
itemIdasnull(now declared nullable) for such lines. Requests naming complete job operations are unaffected. - Added Job In-Process Tracking Response List — lists a job's in-process tracking checkpoints together with every recorded operator reading (stable reading id, numeric/boolean/text value, the operator plus separate
recordedBy/updatedByattribution, the measurement tool, and timestamps), optionally filtered byphase. Each checkpoint also reports its drawing and recording units and the requirement expressed in both (targetValue/minimumValue/maximumValueare in drawing units;recordingTargetValue/recordingMinimumValue/recordingMaximumValueand the readings are in recording units).measurementToolNextCalibrationUtcis the tool's current next-calibration date (live, not snapshotted at reading time). Previously only checkpoint definitions were exposed (via the routing endpoints); this returns the readings actually captured during production. The result is intentionally single-job-bounded and is not paginated — the readings axis is not independently bounded — and an unknown job id returns 404. - Fixed Sales Order Refund Line Item Create and Update mishandling the order's receiving record when adding or removing a return: on some orders a refund-with-return failed with a server error (a dangling receiving reference), and on others the order's receiving record was silently replaced — detaching previously recorded receipts from the order. Both endpoints now load and mutate the order's existing receiving record. Request and response shapes are unchanged.
8/5/2026
- Fixed Note Get failing with a server error for every request — the endpoint's channel lookup sat on an unimplemented legacy query path, so no call could ever succeed. It now behaves as documented: 200 with the note for a valid id, 404 when no note has that id. Request and response shapes are unchanged.
8/3/2026
- Changed Quote Status Update: transitioning a quote to
Sentnow stamps itsquotedDatewith the send time, and — only when the quote'sexpirationstill sits at its create-time default (the configured quote-expiration window measured from the quoted date) — recomputesexpirationfrom the newly stamped date. An expiration that was set deliberately is never moved. Marking an already-Sent/Won/LostquoteSentremains a no-op and changes neither field. Integrations that write a historicalquotedDateand then mark the quoteSentshould reverse the order — set the status first, then write the dates (both fields remain writable afterward). - Added
isMaterialLineto routing input item reads —truewhen the line is tied to an input material (created by a material selection) rather than being a plain component line. Returned by Item Routing Input Item List, Item Routing Input Item Get, the operation-item reads, and the job, quote, and sales-order full-routing input item endpoints. Addition-only — existing payloads gain the field but no field changes. - Fixed Item Routing Operation Batch leaving input materials and input items associated with operations the batch had removed. Steps omitted from the request now release those associations (
routingStepIdreturns tonull), matching single-operation deletion. The endpoint also returns a 400 naming the id when a well-formedsystemOperationIdmatches no operation in system data, where it previously failed with a 500.
7/31/2026
- Improved the rejection for picking material held for incoming inspection via Job Operation Pick. Picking a lot reserved for an incoming or failed inspection has never been allowed; previously a pick naming such a lot by id failed with the generic "No inventory for the given item, location, and lot." Requests now fail with the descriptive rejection naming the lot and the hold (e.g.
Lot {number} is being held for incoming inspection and cannot be picked.), matching the in-app behavior. Still a 400; only the message is more specific — consumers should match on status, not message text. - Inventory Override now rejects an override that would reduce the on-hand quantity of a lot held for incoming inspection (or one that failed inspection), with a 400 naming the lot and the hold — quarantined material can only leave inventory through the inspection workflow (release, or rollback of the receipt). Overrides that keep or increase the held quantity are unaffected, as are all overrides on unreserved and job/sales-order-reserved lots.
7/30/2026
- Fixed
priceon sales order discount line items reading as0. The calculated discount amount (and the derivedsubTotal/preDiscountSubTotal/discountedPriceon the generic line-item shape, plusabsoluteAmounton the discount line item) is now computed from the sales order, so percentage and absolute discounts return their real value for every sales order. Percentage discounts are calculated over the order's part and blanket lines, matching the sales order total. Affects the Sales Order Discount Line Item and Sales Order Line Item endpoints.
7/29/2026
- Added
accountingHeldUtcto Receipt List and Receipt Get responses. The field is set while a receipt's accounting is deferred because it contains material held for incoming inspection (tenants using the newafter-inspectioninvoice-timing mode) and is null otherwise — including for every receipt on tenants that keep the defaulton-receiptmode, where nothing changes. While a receipt is held, Receipt List excludes it; it appears (withaccountingHeldUtcnull) once its inspections complete. Receiptnumbers are stable across the hold — a held receipt keeps occupying its position, so siblings' numbers never shift when it is released. Receipt Get by id remains unfiltered and returns held receipts with the field set. Consumers that reconcile bills from the receipt list should treat a held receipt exactly like one that hasn't been received yet: it will surface in the list when it becomes billable.
7/28/2026
- Added ten values to the tool
typeenum:CmmDatumSphere,ThreadMicrometer,InsideMicrometer,PinMicrometer,SetPlug,NptRingGage,NptPlugGage,GrooveMicrometer,WeldingEquipment, andSurfaceTesterMaster. Returned by Tool Get, Tool List, and tool calibration reads, and accepted by Tool Create, Tool Update, and the Tool Listtypesfilter. Addition-only, but consumers that map the enum should tolerate the new values. - Fixed Item Routing Input Item Delete and Item Routing Input Item Update not applying to the copy of the input item carried on its routing operation. Delete removed only the routing-level line, so the item still appeared on the operation (and in the UI) after a 200; update left the operation copy with stale values. Both endpoints now apply to the operation copy when it can be identified unambiguously — by shared id, or by material for lines stored with a separate id (such as those added through Item Routing Operation Item Create) when the line is the routing's only line for that material. Deleting a line that aggregates one material across several operations removes all of its operation copies; updating such a line changes only the routing-level quantity, leaving the per-operation split intact. No request or response shape changes.
- Added
expirationUtcto Auth Validate — the UTC instant at which the calling token stops being accepted, so an integration can read its own key's remaining life instead of tracking it out of band. Always a future instant, since an expired token is rejected before it reaches the endpoint. A token created with no expiry reports the maximum representable date rather than a real one. Addition-only — existing payloads gain the field but no field changes. - Added optional
skipandtakequery parameters to Item Routing Input Material List. Addition-only — requests that omit them keep receiving the full list, unchanged. - Added
requiredStockPiecesto Reporting Material Requirements List — the stock pieces (nests) needed to produce the row'sjobPlannedQty, alongside the existing required weight. Null on item requirement rows, and null when the material's nest yield is unknown, so null means not known rather than none needed. The value is fractional, since the unconsumed part of a piece returns to stock as a remnant — round up when sizing a purchase or a pick. Each row is scoped to one operation, so do not sum the field across a job's operations. Addition-only — existing payloads gain the field but no field changes. - Fixed
priceon purchase order discount line items reading as0. The calculated discount amount (and the derivedsubTotal/preDiscountSubTotal/discountedPriceon the generic line-item shape) is now computed from the purchase order, so percentage and absolute discounts return their real value for both new and historical purchase orders. Percentage discounts are calculated over the order's part and outside-processing lines, matching the purchase order total. Affects the Purchase Order Discount Line Item and Purchase Order Line Item endpoints.
7/27/2026
- Added
employeeIdto User List results. User Get has returned the field since it was introduced, but the search response omitted it, so resolving an employee identifier for a set of users meant following every search with a per-user get. Addition-only — existing consumers are unaffected, and users with no employee identifier returnnullas they do on User Get.
7/24/2026
- Added optional
includeDeletedto User List. When true, inactive/deleted users matching the search are returned (withdeleted: true); omitting it (or sending false, the default) preserves the current active-only behavior. Previously a deactivated user was excluded from search results even when queried explicitly by email — inconsistent with User Get, which already returns deleted users. Addition-only — existing consumers are unaffected. - Added the tool calibration write surface (no sign endpoint — signing a calibration record remains a human act performed in the product — and no delete endpoints). Tool Calibration Create records a calibration: an external vendor or customer attestation, or an in-house calibration with per-checkpoint
responsesmeasured against the tool's current template. The server derives the As-Found/final results from the measurements and rejects aresultthat disagrees, pins the template version, stamps the measurer, and attributes customer-source records to the tool's owning customer; reference gages take no records. A save recording a new failure automatically opens an NCR, echoed ascreatedNcr. Tool Calibration Update edits an unsigned record (signed records are immutable) as a full replacement with re-derivation, guarded by optimistic concurrency: reads of a record by id now return an opaqueversiontoken, the update requires it, and a stale token is rejected with 409. Tool Create and Tool Update manage tools (identity, type, status, calibration schedule, ownership); a calibration frequency ofnonecreates a reference gage, andoutForRecalibrationDateUtc(also added to Tool Get) marks a tool out for recalibration in tandem with theoutForCalibrationinactive reason. Tool Calibration Template Create publishes a new append-only template version (checkpoints, tolerances, trials, environment ranges, master gauges); existing records stay pinned to the version they were measured against. Record writes require the Perform Calibration permission; tool and template writes require Edit Tool Template — mirroring the in-app permission model. Creates are not idempotent: a request retried after a timeout creates a second record (and a second NCR for a failing calibration) — list before re-creating. - 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
addItemsToInventoryto 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.
7/23/2026
- Added a read-only
ratesblock 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 the tool calibration read surface. Tools: Tool Get returns a tool's identity (
number, renderedT-{number}for display), serial number, type, status, calibration schedule, computednextCalibrationDateUtc, and its latest calibration outcome (lastCalibrationResult,lastCalibratedBy); Tool List additionally returns the derivedcalibrationStatusthe tools grid displays, with filters for search, types, statuses, due windows (isOverdue,dueWithin7Days,dueWithin30Days), reference gages, andmodifiedAfterUtcfor incremental polling of created/edited tools. Templates: Tool Calibration Template Latest, Versions List, and Version Get expose the checkpoints, tolerances, trial counts, environment ranges, and master gauges a calibration is measured against, plus each version's effective range. Records: Tool Calibration Get and Tool Calibration List return calibration history — results, As-Found/As-Left measurements by checkpoint and trial, the pinned template version, and sign state — filtered by tool, vendor, result, type, and date range. Tool Calibration Certificate downloads a record's certificate PDF (the exact artifact frozen at signing once a record is signed). All endpoints require the View Tool Calibration permission on user-bound tokens.
7/22/2026
- Added optional
numberto 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.
7/20/2026
- Added
routingStepIdto routing input items, identifying the operation a required item is attached to. Returned by the input-item read endpoints, including Item Routing Operation Items List, Item Routing Input Items List, and Job Full Routing Input Items List. Addition-only — existing payloads are unaffected. - 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, andworkOrderOperationNameto 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.
7/19/2026
- Fixed
priceon invoice discount line items reading as0. The calculated discount amount (and the derivedsubtotal/discountedSubtotalon 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.
7/16/2026
- 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.
7/15/2026
- Sales-order date fields (
orderedDate,dueDate,productionDueDate,deliveryDueDate, and part-line-itemdeliveryDate) 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.
7/14/2026
- Added Timer Create endpoint for recording completed setup, labor, and machine timer blocks with explicit
startedOnUtcandstoppedOnUtctimestamps — for time captured outside Fulcrum (backdated up to 30 days). - Removed the incorrect
minLength: 1published 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.
7/13/2026
- 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.
7/10/2026
- Added Shipment Get endpoint.
- Added
shipByDateBefore,shipByDateAfter,shippedDateBefore, andshippedDateAfterfilters to Shipment List. - Added
salesOrderIdandpurchaseOrderIdfilters to Shipment Line Items List; the line-item response now also carriesshipmentStatus,shipByDate,shippedDate, andshippedDateOverridefrom the parent shipment. - Added calculated
shipByDateto 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
modifiedAfterUtcandmodifiedBeforeUtcfilters to Job List and Operation List for incremental polling of changed records.
7/9/2026
- 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.
7/8/2026
- Added
shopRateMachine(machine-time shop rate cost) to cost-breakdown responses alongside the existingshopRateSetupandshopRateRun. Affects Job Item-To-Make Cost Breakdown, Quote Part Line Item Cost Breakdown, Sales Order Part Line Item Cost Breakdown, and cost breakdowns embedded viaincludeCostBreakdown.
6/30/2026
- Added Reporting endpoints serving report-ready, pre-joined rows from Fulcrum's reporting views in a single paged call: Inventory, Invoice, Job Activity, Job Activity By Operator, Quote, Sales Order Lines, Shipping, and Time Clock.
- Added
netValueChangeto 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.
6/29/2026
- Fixed Job Tracking Get failing for jobs whose cost breakdowns contain legacy overhead rows; the cost-breakdown
costTypevalue set gainedoverheadandunknown. Also fixedcomponentLaborcost-breakdown lines reporting the material per-unit cost instead of the labor per-unit cost.
6/24/2026
- Added write endpoints for shop-setup resources, which were previously read-only on the API: Department Create and Update, Work Center Create and Update, Equipment Create and Update, and Operation Update. Updates are full-replace.
6/18/2026
- Added
routingNotesto Job Item-To-Make Get, Job Item-To-Make List, and the items-to-make returned by Job Tracking Get, surfacing the routing notes captured on the job's routing for that item.
6/15/2026
- Fixed Inventory Event List failing whenever the
types,secondaryTypes,sourceTypes, orreservedForTypesfilters were supplied.
6/8/2026
- Added rework information to Job Operation List:
isReworkandhasAssociatedReworkflags, plus areworkobject with the reason, notes, quantities, and creator.
5/26/2026
- 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.
5/25/2026
- Added
status,active,leadTime,url, andvendorSinceto Vendor Get and Vendor List, and made them (plusnotesandcurrencyCode) writable via Vendor Update and Vendor Patch. - Added
notesandemailPurchaseOrdersto the Vendor Contact create, update, get, and list endpoints.
5/20/2026
- Added
boxto thepackingDetailsentries on Shipment Line Items List, identifying the box a packed quantity was packed into.
5/8/2026
- Added CAPA Get endpoint.
- Added NCR Get endpoint.
- Added Scrap Report endpoint returning scrap entries (item, quantity, value, operator, operation, work center, department, equipment, and job) over a date range.
5/6/2026
- 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.
5/4/2026
- Added
createdUtcto Attachment Get and Attachment List.
5/3/2026
- 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.
4/23/2026
- 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
/.
4/12/2026
- Added Item Can-Make endpoint returning
canMakeFromOnHandandcanMakeFromAvailablefor make items. - Added
earliestScheduledStartUtcto Job Create, Job Get, and Job Update.
4/10/2026
- Added support for
customFieldson Customer Create, Customer Patch, and Customer Update. This is an addition-only change — existing payloads continue to work unchanged.
4/6/2026
- Added
productionDueDateto Sales Order Get.
3/24/2026
- Fixed Item Routing Operation Batch to apply
inputMaterialIdsassociation and validation to existing routing steps, not just newly created ones.
3/5/2026
- Added Tax Allocations endpoint for purchase order part line items.
- Added Tax Allocations endpoint for purchase order line items.
- Added Tax Allocations endpoint for purchase order fee line items.
- Added Tax Allocations endpoint for purchase order outside-processing line items.
3/2/2026
- Added Job Item-To-Make Operation Items Required endpoint.
- Added Job Item-To-Make Operation Materials Required endpoint.
2/24/2026
- Added
createdFromQuoteIdto Sales Order Get and Sales Order List so consumers can resolve a sales order's originating quote without scanning the full quote list.
2/21/2026
- Removed operation references from cost-breakdown lines and timers. Cost breakdown lines now expose a flat
referenceIdandreferenceNameinstead of a nested operation object. Affects all endpoints that return Cost Breakdown data.
2/18/2026
- Purchase Order Part Line Item Patch now bypasses status validation when only
externalReferences,promiseDate, orreceiveByDateare being modified, matching the existing behavior on the parent purchase order.
2/13/2026
- Added back public API mapping for material grid query parameters on Material List.
2/12/2026
- 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.
2/10/2026
- Removed the
modificationsfield fromMaterialShapeDto(affects Material List and Material Get). The field has been unpopulated since the v3 material schema rolled out; usetype,spec,subspec, andfinishinstead.
2/9/2026
- 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
enableRemnantSyncto Item Get and Item List so ProNest integrations can opt items in or out of remnant sync.
2/4/2026
- Added certification support to attachments on receiving line items. See Certification Attachment Create.
2/3/2026
- Item Routing Input Item Update now keeps the routing-step input item association in sync when an input item is bound directly to a routing step.
2/2/2026
- Added Tax Rate Create endpoint.
- Added Tax Rate Update endpoint.
1/26/2026
- Reshaped the NCR DTO: split impact information into a dedicated
impactobject, expandeddepartmentinto a fullReferenceDtowith id, and added user-reference mappings. Existing fields remain available; consumers readingimpact*fields directly should migrate to the nestedimpactobject.
1/23/2026
- Item Create no longer forces
lotTrackingUsagetofalsewhen omitted; system settings are used for the default instead.
1/22/2026
- Added
notesto Item-Vendor Create, Item-Vendor Get, and Item-Vendor Update.
1/19/2026
- Consolidated routing-step creation logic across Item Routing Operation Create, Item Routing Operation Batch, Job Full Routing Operation Create, Quote Part Line Item Full Routing Operation Create, and Sales Order Part Line Item Full Routing Operation Create. The Batch endpoint now applies the same input-material association rules as the single-create endpoint.
- Added
materialIdsexposure to Operation Get.
1/15/2026
- Removed the spurious length restriction on
inputMaterialIdsin Item Routing Operation Create.
1/2/2026
- Added
attachMaterialsToOperationstoggle 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.
12/18/2025
- Added
vendorOrderNumber,vendorPartNumber, and additional bypass-validation fields to Purchase Order Outside Processing Line Item Patch.
12/15/2025
- Replaced
outsideProcessingTimewithoutsideProcessingCoston operation DTOs returned and accepted by Operation Create, Operation Get, and the operation entries inside item-routing endpoints. Consumers usingoutsideProcessingTimefor outside-processing operations must migrate.
12/12/2025
- Added unit specifiers (
widthUnit,heightUnit,lengthUnit,thicknessUnit) to Material Activate so metric and imperial materials can be created without ambiguity.
12/2/2025
- Added Inventory Event Get endpoint.
- Added Inventory Event List endpoint.
- Added Inventory Event Details Get, Inventory Event Details Patch, and Inventory Event Details Update endpoints for setting external references on inventory events without modifying the events themselves.
11/26/2025
- Item Routing Operation Create and Item Routing Operation Batch now respect explicit routing times when supplied in the payload, falling back to operation defaults only when omitted.
11/19/2025
- Added
notesToCustomerto Quote Create, Quote Get, Quote Patch, and Quote Update.
11/12/2025
- Added
promiseDateandexpectedReceiveDateto Purchase Order Part Line Item create/get/list/patch/update endpoints. - Added
promiseDateandexpectedReceiveDateto Purchase Order Outside Processing Line Item create/get/list/patch/update endpoints.
11/6/2025
- Item Routing Operation Create now applies operation default routing times when none are provided in the request payload.
10/24/2025
- Restructured Item-Vendor List to return the full vendor resource (including price-break information) rather than the base item shape only.
10/21/2025
- Added Sales Order Part Line Item Cost Breakdown endpoint.
- Added Quote Part Line Item Cost Breakdown endpoint.
- Added Job Item-To-Make Cost Breakdown endpoint.
- Added
includeCostBreakdownquery parameter to Sales Order Part Line Item Get, Sales Order Part Line Item List, Quote Part Line Item Get, Quote Part Line Item List, Job Item-To-Make Get, and Job Item-To-Make List.
10/20/2025
- Added
categoryId,isSingleUse, andisLotTrackedto Item Create, Item Get, Item Update, and Item Patch. - Added
instructionsto Item Routing Operation List and Item Routing Operation Update. - Added
customerDetailsto Item Get and Item List V2, and expandedvendorDetailsto include price breaks. SetincludeCustomerData=trueon the list endpoint to opt in. - Added
createdBeforeUtc,createdAfterUtc,modifiedBeforeUtc, andmodifiedAfterUtcfilters to Sales Order List.
10/17/2025
- Added
internalNotesto Job Get.
10/15/2025
- Fixed full-routing IPT creation on jobs, quote part line items, and sales-order part line items so the IPT field-type reference is populated correctly. Affects Job Full Routing IPT Create, Quote Part Line Item Full Routing IPT Create, and Sales Order Part Line Item Full Routing IPT Create.
10/9/2025
- 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
salesOrderIdandsalesOrderLineItemId.
10/8/2025
- Added a number of fields to Sales Order Get and Sales Order Part Line Item endpoints, including a
useV3Shippingindicator on the sales order. - Added
expectedReceiveDateandpromiseDateto Purchase Order Update and Purchase Order Patch; addedpromiseDateto Purchase Order Get. - Inventory Receive now accepts
machineValue,laborValue,materialValue, andoutsideProcessingvaluations, and accepts eitherlotNumberorlotId(creating the lot if the supplied number doesn't exist).
10/1/2025
- Added Certification Attachment Create endpoint for uploading certifications against receiving line items and items.
- Tightened Attachment Create and Remote Attachment Create to always treat attachments as
Standard. TheattachmentTypefield 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.InventoryLotis now reserved to certifications).
9/24/2025
- Added Timer Patch endpoint.
- Added Timer Update endpoint. (Currently scoped to
externalReferencesupdates only.) - Added Job Tracking Timer List endpoint as a dedicated job-tracking-scoped timer listing alongside the general Timer List.
9/23/2025
- Expanded Attachment Create and Remote Attachment Create to accept
PurchaseOrderReceivingandSalesOrderReceivingas owner types.
9/19/2025
- Added contact information to Sales Order Get and Sales Order List.
- Added
buildToOrderandbuildToStockto Item Create, Item Get, Item Update, and Item Patch.
9/17/2025
- Added
sentDateto Sales Order Get (null until the order moves past Approved).
9/12/2025
- Added Add additional quantity completed to a job operation endpoint.
5/25/2025
- Added deposit fields to Sales Order Create
- Added deposit information to Sales Order List and Sales Order Get
5/21/2025
- Added option to search by modifiedAfterUtc on Customer List.
- Added option to search by modifiedAfterUtc on Quote List.
- Added accountingDetails to all line item and item endpoints. This currently only contains the classId with planned further expansion.
- Add Item Class List endpoint for searching item class definitions.
- Add Item Class Get endpoint.
5/14/2025
- Add Custom Field List endpoint for searching custom field definitions.
- Add Custom Field Get endpoint.
- Add Customer Tier List endpoint for searching customer tier definitions.
- Add Customer Tier Get endpoint.
- Added customerTierId to Customer List and Customer Get.
- Added customerTiers information to Item List and Item Get.
5/6/2025
- Added packingDetails to Customer List.
- Added customerName and scheduledEquipmentName to JobTracking Get.
- Added materialDetails to Item List and Item Get.
4/18/2025
- Added hasCustomerPortal indicator to Customer List and Customer Get.
- Added externalReferences and weight to Items.
- Added workOrderId to Job List and Job Get and operations endpoints.
4/8/2025
- Adds Time Clock Endpoints to enable Time Clock Integrations. This includes the following:
- A Clock In endpoint.
- A Clock Out endpoint.
- A List Timers endpoint.
- Added currencyCode to Vendor List and Vendor Get.
- Add various FullRouting endpoints.
3/27/2025
- Added Material Vendor.
3/17/2025
- Added dateOriginal and dateOverride to Receipt List and Receipt Get.
2/26/2025
- Added vendorNote information to multiple endpoints.
2/21/2025
1/16/2025
- Added option to search by email on Customer List.
- Added time basis values on operations.
1/3/2025
- Add CAPA List endpoint.
12/17/2024
- Added invoiceNumber to Receipt List when retrieving a receipt.
- Added invoiceNumber to Receipt Get when searching receipts.
- Added externalReferences to V3 Shipment objects Shipment List and Shipment Get
- Added address, shippedDate, shippedDateOverride, and shippingCost to Shipment Update.
- Added isTaxable to Item Create and Item Update
- Added sourceType, relatedEntityType, and relatedEntityId as filter parameters for [Inventory Transactions List](/api-schema#tag/Inventory-Transactions/operation/ ListInventoryTransactions)
- Added value and totalValue to Inventory Transactions List
- Added externalReference as a filter parameter to Receipt List when retrieving receipts.
- Added shippedFromLocations to V3 Shipment Line Items List.
12/10/2024
- Added vendorOrderNumber to Purchase Orders.
11/26/2024
- Expand parameters for Items List to allow for case-sensitivity toggling.
11/19/2024
- Add NCR List endpoint.
- Enforce line-item based endpoints to retain sort order based on their position.
- Update line-item based endpoints to use the parent item's description if no value is supplied when the line item is created.
11/12/2024
- Add "yard" as valid line item unit of measure. Affects multiple endpoints that utilize units of measure.
11/05/2024
- Allow up to 2000 characters on Item Descriptions. Affects multiple endpoints that use this validation attribute.
10/29/2024
- Added createdUtc to Sales Order List and Sales Order Get
- Added shippingCost and shippingCharge to V3 Shipment objects Shipment List and Shipment Get
- Add externalReferences to Item List and Item Get.
- Add shippingMethodId to Shipment Patch and Shipment Update/
10/22/2024
- Expose V3 Shipping endpoints Shipment List, Shipment Patch, Shipment Update
- Added shippingMethod and shippingAccount to V3 Shipment objects Shipment List and Shipment Get
- Update V3 Shipment Line Items List endpoint to allow for searching by multiple line item ids.
- Corrected duplicate custom field update routes.
10/08/2024
- Add customFields to Items List
- Add deliveryDueDate to Sales Order Patch
- Add deliveryDueDate to Sales Order Update
- Update Item Create to carry though system defaults on accountingCodeId, accountingCode2Id, and isSellable when not supplied
- Add customFields to Receipt List when retrieving a receipt.
- Add customFields to Receipt Get when searching receipts.
10/01/2024
- Added salesUnitOfMeasureConversions to Item Create
- Added salesUnitOfMeasureConversions to Item Update
- Added salesUnitOfMeasureConversions to Item List
- Added ItemRoutingOperation Bulk Create endpoint
- Add deliveryDueDate to Sales Order Update
9/17/2024
- Added V3 Shipment Line Items List endpoint
- Added accountingCode2Id to Item endpoints
9/10/2024
- Added workOrderOperation as an Attachment ownerType
- Added V3 Shipments endpoint for creating, updating, and searching V3 Shipments
9/3/2024
- Add Job Tracking Timer endpoints for starting, stopping, and searching timers
8/27/2024
8/13/2024
- Add subtotal, and preDiscountSubTotal to partLineItems for Quotes, Sales Orders, and Purchase Orders
8/6/2024
- Add rate to Tax Rate
- Add Inventory OnHandByItem
- Add Inventory Transactions List
- Add internalNotes to Item
7/30/2024
- Add description, minimumProductionQuantity, minimumStockOnHand to Item Create
- Add description, minimumProductionQuantity, minimumStockOnHand to Item Update
7/23/2024
- Add Item Custom Fields Update
- Add additional tax rate filter by tax rate id Tax Rates List
7/16/2024
- Added completedOnUtc, cancelledOnUtc, and revenue to Jobs Get
- Add url property to all externalReferences properties
- Add externalReferences to Quote Part Line Item Create
- Add externalReferences to Quote Part Line Item Update
- Add customFields to Quote Get and Quote List
- Add customFields to Quote Part Line Item Get and Quote Part Line Item List
7/9/2024
- Added UserStatuses List for retrieving a list of user statuses, which shows if they are clocked in, on break, and what jobs they are working on.
- Added UserStatus Get for retrieving a single user status, which shows if they are clocked in, on break, and what jobs they are working on.
- Added deliveryDate, isPercentageDiscount, and discountAmount to Sales Order Part Line Item Create
- Added deliveryDate, isPercentageDiscount, and discountAmount to Sales Order Part Line Item Update
6/25/2024
- Added Name, QuantityToMake, ProductionDueDate, and Notes to Job Update endpoint
- Added Attachment List for retrieving a list of attachments.
- Added Attachment Get for retrieving information about specific attachment.
- Added Attachment Download for downloading a specific attachment.
- Added Attachments Download for downloading a zip of attachments (via filter).
6/18/2024
- Added Equipment List for retrieving a list of equipment.
- Added Equipment Get for retrieving a piece of equipment.
- Added Department List for retrieving a list of departments.
- Added Department Get for retrieving a department.
- Added WorkCenter List for retrieving a list of workcenters.
- Added WorkCenter Get for retrieving a workcenter.
- 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
5/21/2024
- Added Attachment for adding an attachment to an entity.
- Added Remote Attachment adding an attachment to an entity from a remote file location.
5/14/2024
- Added Material List for acquiring materials.
- Added Material Get for get a material.
- Added Material Activate for activating a material from the global material repository for usage in your Fulcrum site.
4/23/2024
- Added Shipping Method for acquiring a shipping method.
- Added Shipping Method List for searching for shipping methods.
4/18/2024
- Added ExpectedReceiveDate when retrieving an part line item on a purchase order.
- Added ExpectedReceiveDate when retrieving a purchase order or list of purchase orders.
4/5/2024
- Added Inventory Override
3/28/2024
- Updated Sales Order Part Line Create to use the Fulcrum derived price (based on existing price breaks) for an item when not provided.
- Updated Sales Order Part Line Update to retain the existing line item price when not provided.
3/12/2024
- Quote Part Line Items Create Batch added for adding multiple part line items to a quote order at once.
- Added item notes, isTaxable, taxCodeId, taxRate, externalReferences, isPercentageDiscount and discountAmt to Quote Part Line Items Get.
- Added item notes, isTaxable, taxCodeId, taxRate, externalReferences, isPercentageDiscount and discountAmt to Quote Part Line Items Create.
- Quote Part Line Items Update added for updating a quote part line item.
- Added Customer Id when retrieving a quote.
- Corrected Quote Fee Line Item to correctly provide a description and name value.
3/1/2024
- Added Line Items when retrieving a receipt.
- Added option to incude Line Items when retrieving a list of receipts using includeReceiptLines.
- Added option to include Vendor Data when retrieving a list of items using includeVendorData.
- Added option to include Usage Data when retrieving a list of items using includeUsageData.
- Added Custom Fields when retrieving a list of items.
- Added Custom Fields when retrieving an item.
- Added Minimum Stock On Hand when retrieving a list of items.
- Added Minimum Stock On Hand when retrieving an item.
- Added CategoryId when retrieving a list of items.
- Added CategoryId when retrieving an item.
- Added Addresses when retrieving a list of vendors.
2/23/2024
- Added ConvertedQuantityReceived when retrieving a receipt line item.
- Added UnitOfMeasureMultiplier when retrieving a receipt line item.
- Added ConvertedQuantityReceived when listing a receipt's line items.
- Added UnitOfMeasureMultiplier when listing a receipt's line items.
2/15/2024
- Added CreatedUtc when retrieving a job.
- Added CreatedUtc List when listing jobs.
- Added createdBeforeUtc Filter for filtering jobs.
- Added createdAfterUtc Filter for filtering jobs.
2/14/2024
- Added Paid Date to Invoice Update Status method for setting the
paidDateproperty on an invoice - 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.
2/13/2024
- Added Gauge Code for acquiring a gauge code that exists in Fulcrum tags.
- Added Gauge Code List for searching for gauge codes that exists in Fulcrum tags.
- Added Grade Code for acquiring a grade codes that exists in Fulcrum tags.
- Added Grade Code List for searching for grade codes that exists in Fulcrum tags.
- Added Material Code for acquiring a material codes that exists in Fulcrum tags.
- Added Material Code List for searching for material codes that exists in Fulcrum tags.
- Added Shape Code for acquiring a shape codes that exists in Fulcrum tags.
- Added Shape Code List for searching for shape codes that exists in Fulcrum tags.
- Updated Item Create to includes more fields (gauge, materialCode, shape, grade, height, length and width).
- Added Item Update for updating an item. Minimal subset of fields.
1/29/2024
- Added operation name to the Job Item To Make Operation endpoint.
1/26/2024
- Added instructions to the Job Item To Make Operation endpoint.
1/16/2024
- Added Pick item for job
12/13/2023
- Added vendor notes to the User endpoints.
12/12/2023
- Added employeeId to the User endpoints.
12/7/2023
- Added taxCodeId to the Invoice line item endpoints and the Purchase Order Line Item endpoints.
11/13/2023
- Updated the Invoice endpoints to include 'Total', 'Subtotal', and 'NotesToCustomer' fields.
9/26/2023
- Sales Order Part Line Items Create Batch added for adding multiple part line items to a sales order at once.
9/12/2023
- Added operation custom fields to the job item-to-make operation List/Read endpoint
- Provided write/update access to the operation custom fields via the new job item-to-make operation write/update endpoint
- Sales Order Refund Line Items List updated to include: accounting code, refund reason code, returns (and their quantity) and external references.
- Sales Order Refund Line Items Create added for creating a refund line item on a sales order.
- Sales Order Refund Line Items Update added for updating a refund line item on a sales order.
- Sales Order Refund Line Items Delete added for removing a refund line item on a sales order.
- Refund Reason Code Get added for acquiring a refund reason code.
- Refund Reason Code List added for searching refund reason codes.
- Sales Order Delete updated to validate additional touchpoints before pursuing a deletion.
9/5/2023
- Scheduled start time, scheduled end time, and scheduled equipment ID added to the job item-to-make operation List/Read
- Deprecated the
statusfield in favour ofstatusesin 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.statusis Scheduled for removal EOD 2023-10-31. - Added the
hasIncompleteOperationsin the request body schema for [job List][api-schema#tag/Job/operation/ListJob] to filter for jobs with incomplete operations.
8/22/2023
- Priority added to sales order Create/Read/Update
8/15/2023
- Deleted indicators added to Sales Order, Invoice and Purchase Order objects. While
/listendpoints 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.
8/8/2023
- 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.
8/1/2023
- Add units of measure to Item Vendor Details.
- Respect the IsTaxable value provided to the Customer create, update and patch endpoints.
7/25/2023
- Added ShipByDate to available filters as well as the response object of Shipments list.
7/18/2023
- Added Shipment Create.
- Added Shipment Rollback/Revert.
7/12/2023
- Deprecate Item Pick. Scheduled for removal EOD 2023-10-13.
- Deprecate Item Receive. Scheduled for removal EOD 2023-10-13.
- Added Inventory Pick.
- Added Inventory Receive.
- Added Inventory Lot Create.
- Added Inventory Lot Get.
- Added Inventory Lot List.
5/1/2023
- Initial release