API V3 Changelog

Check back here for the latest updates to API v3

API Newsletter

To receive important updates and announcements regarding the API, sign up for our API Newsletter. This is the most effective way to stay informed about the Aligni API and keep your integration working smoothly.

To subscribe to the API Newsletter go to Account Settings > Newsletter Subscription and click the API Updates box.

2026-10-08

  • Fix: return the unit at the destination from inventoryUnitMove.inventoryUnit. When part of a unit is reserved, the move splits it and moves the available quantity as a new unit. The field returned the original unit, left at the source with the reserved quantity. A client that reads that unit from inventoryUnit after a split should read remainingInventoryUnit instead.
  • Add remainingInventoryUnit field to inventoryUnitMove. When the move splits a partly reserved unit, it returns the unit left at the source. That unit keeps the ID sent in inventoryUnitId. The field is null when the whole unit moves.

2026-10-07

  • Fix: mark the inventory log entries that inventoryConsume writes as API-generated. Event data and webhooks showed them with api_generated false. An integration that ignores API-generated changes by checking api_generated now ignores these consumptions too.
  • Fix: mark the inventory log entries that inventoryUnitUpdate and vendorManagedInventoryUnitUpdate write as API-generated. Event data and webhooks showed them with api_generated null. An integration that ignores API-generated changes by checking api_generated now ignores these updates too.
  • Fix: save the inventoryLogEntry.apiOrigin sent to vendorManagedInventoryUnitCreate on the new unit’s inventory log entry, and mark it API-generated. Event data and webhooks showed these entries with api_origin empty and api_generated false. An integration that ignores API-generated changes, by checking api_generated or api_origin, now ignores these creates too.
  • Fix: refuse inventoryUnitCreate into a vendor-managed zone, with the error “Warehouse zone is vendor managed. Use vendorManagedInventoryUnitCreate instead.” Refuse inventoryUnitUpdate on a vendor-managed unit, with the error “Inventory unit is vendor managed. Use vendorManagedInventoryUnitUpdate instead.” Use the vendor-managed mutations for these units. They take availableInStock, which the generic ones can’t set. They have no displayUnitId, so vendorManagedInventoryUnitCreate takes costPerUnit in the part’s unit of measure.

2026-10-06

  • Fix: refuse inventoryUnitMove and inventoryUnitSplit into a zone in a warehouse where the account may not manage inventory, or in a deactivated warehouse, with the error “Couldn’t find Zone with id=…”. They looked the zone up across the whole organization.
  • Fix: return null from Build.partRevision when the part revision was deleted. It returned a copy of the deleted revision. Some fields on that copy, such as active, failed the query with a 500 error.
  • Fix: save the inventoryLogEntry.apiOrigin sent to inventoryUnitMove on the move’s inventory log entries, and mark them API-generated. Event data and webhooks showed them with api_origin null and api_generated false. An integration that ignores API-generated changes, by checking api_generated or api_origin, now ignores these moves too.

2026-10-01

  • Fix: refuse inventoryUnitMove and inventoryUnitSplit into a quarantine zone, with the error “Inventory can’t be moved into a quarantine zone.” They moved the stock in with no QCR, so it stayed available to builds.
  • Fix: Part.creator is now nullable. A part can have no creator. The non-null declaration failed any query that selected the field on such a part.

2026-09-28

  • Require view_suppliers to read PurchaseItem.vendor, as PurchaseOrder.vendor already does. Without it, the field returns null with the error “You do not have permission to perform the selected action.”
  • Fix: return null with the error “You do not have permission to perform the selected action.” from QualityControlRecord.build when the account may not view the build, and from QualityControlRecord.purchaseItem and Quote.purchaseItems when it may not view purchases. Viewing a build needs the view builds permission in its warehouse. These fields returned the build and the purchase items in full.
  • Fix: refuse access to builds for accounts that don’t have access to builds in any warehouse, with the error “You do not have permission to perform the selected action.” It returned the builds that have no warehouse.
  • Fix: Build.warehouse and Build.partRevision are now nullable. Deleting a warehouse or a part revision clears it from its finalized builds. The non-null declaration failed any query that selected the field on such a build.

2026-09-24

  • Fix: in qualityControlRecords, list only the QCRs in warehouses where the account may view QCRs. totalCount and metadata‘s totalRecords, totalQueries and totalComplexity now count the same QCRs.
  • Fix: refuse qualityControlRecords to an account that may not view QCRs in any warehouse, with the error “You do not have permission to perform the selected action.”
  • Fix: leave QCRs in warehouses where the account may not view QCRs out of QualityControlRecord.ancestors and QualityControlRecord.derivedQualityControlRecords, and leave their bins out of RootCause.assignedQualityDispositionBins. These lists returned them in full.
  • Fix: return null with the error “You do not have permission to perform the selected action.” from QualityControlRecord.originQualityControlRecord, QualityControlRecord.originQualityDispositionBin and QualityDispositionBin.derivedQualityControlRecord when the QCR is in such a warehouse. They returned it in full. An account permitted in every warehouse sees no change.

2026-09-23

  • Fix: return the matching ancestors from QualityControlRecord.ancestors when given filters, instead of a 500 error. They come nearest first, the same order as without filters.

2026-09-20

  • Require view_costs to read a cost field. Fifteen fields are now gated: standardCost, standardCostMin, standardCostMult, standardCostComment and standardCostCurrency on Part; costPerUnit and costPerUnitBase on InventoryUnit and on DenormalizedInventoryUnit; unitCost, finalizedComputedUnitCost, finalizedEstimatedUnitCost and finalizedManualUnitCost on Build; price on PurchaseItem and on Quote. PurchaseItem.quote now asks for the same permission, as Part.quotes already did. Without the permission, these fields return null with the error “You do not have permission to perform the selected action.” Part.standardLeadTime and Build.finalizedUnitCostSelection are not costs and are unchanged.
  • Refuse a filter that names a gated field to an account without the permission. A filter built its condition without asking, so parts(filters: [{field: "standardCost", value: {gte: 100}}]) answered a cost question the same account could not ask directly. That query now fails with the same error and returns no data.

2026-09-18

  • Fix: Vendor.portalEnabled now returns false for vendors that had no value stored. The field is non-null, so selecting it on those vendors failed the query.
  • Fix: vendorCreate and vendorUpdate now reject portalEnabled: null with the error “Vendor portal must be true or false.” A null was saved and failed every later query that selected the field.
  • Fix: partUpdate no longer clears manufacturedHere when the input leaves it out. The argument carried a default of false, so any update that omitted it turned the flag off. An omitted field now leaves the stored value alone.
  • Default partCreate‘s manufacturedHere to true when the input leaves it out. It was false before. true is the column default and matches the part form, which starts checked.
  • Record changes to manufacturedHere in Part.activityRecords. The field was never recorded before, so changes made earlier are not listed.

2026-09-17

  • Fix: return false for Part.qualityControlRequired on parts that had no value stored. The field is non-null, so selecting it on those parts failed the query.
  • Fix: reject qualityControlRequired: null in partCreate and partUpdate. A null was saved and failed every later query that selected the field. partUpdate returns “Quality Control Required must be true or false.” in errors. partCreate fails with the top-level error “Validation failed: Quality control required Quality Control Required must be true or false.”, the same way it reports its other validation errors.
  • Fix: return false for Part.hidden on parts that had no value stored, and include those parts when filtering on hidden. The field is non-null, so selecting it on those parts failed the query.
  • Fix: reject hidden: null in partCreate and partUpdate. A null was saved, failed every later query that selected the field, and left the part out of hidden filters. partUpdate returns “Hidden must be true or false.” in errors. partCreate fails with the top-level error “Validation failed: Hidden Hidden must be true or false.”, the same way it reports its other validation errors.

2026-09-16

  • Fix: PurchaseItem.part and PurchaseItem.unit are now nullable. Unmanaged purchase items have neither, so the non-null declaration failed any query that selected them on a purchase order with an unmanaged item.
  • Add useAsUnits field to PurchaseItem, the free-text unit of measure of an unmanaged item.

2026-08-26

  • Fix: creating a part from an existing part with “Copy Quotes” now copies only the source part’s own quotes. Quotes that belong to a vendor’s RFQ response are no longer copied — an unanswered one produced a quote with no price that the model rejects.

2026-08-25

  • Fix: BOM items and quotes copied into a new part (creating a part from an existing part with “Copy Part List” or “Copy Quotes”) now get an id. They were saved without one, so they were missing from id filters and could not be read, updated, or deleted through the API. Records already saved without an id are backfilled.

2026-08-03

  • Fix: return 400 Bad Request (was 500 Internal Server Error) when variables is sent as a number or a boolean instead of an object, with the message “Integer is not supported format for sending variables.” Arrays already returned 400 and are unchanged.

2026-07-10

  • Fix: bomItemUpdate/bomItemDelete and subpartUpdate/subpartDelete now reject changes to BOM items whose parent part revision is released, failing with an authorization error. Released revisions are immutable; these mutations previously bypassed that rule, which the web UI and create mutations already enforced.

2026-07-09

  • Rename Subpart to BomItem across the API. Add the BomItem type, the PartRevision.bomItems connection, the bomItemCreate/bomItemUpdate/bomItemDelete mutations, and the BomItemInput/BomItemUpdateInput inputs. BomItemInput uses parentPartRevisionId and childPartRevisionId (replacing partRevisionId and subpartPartRevisionId).
  • Deprecate the Subpart type, the PartRevision.subparts connection, and the subpartCreate/subpartUpdate/subpartDelete mutations. They still work but will be removed in a future version after October 20th 2026.; use the BomItem equivalents.
  • Change PartRevision.parentBomItems to return BomItem (was Subpart).

2026-07-07

  • Add parentBomItems connection to PartRevision, listing the BOM line items in which the revision is used as a component (“where used”).
  • Add parentPartRevision field to Subpart, resolving the assembly revision that owns the BOM line item. Together these enable traversal from a part revision up to the assemblies that consume it: partRevision → parentBomItems → parentPartRevision → part.

2026-07-02

  • Fix: paginated connections now return rows in a stable order (by ascending id) so cursor pagination is deterministic. Previously connections without an explicit sort (such as inventoryUnits) had an undefined order, which could duplicate or drop edges and end a traversal early when pages were fetched with a delay between requests while records changed.

2026-07-01

  • Return 403 Forbidden (was 400 Bad Request) when creating, updating, or deleting a subpart on a released part revision. The error message is now “You do not have permission to perform the selected action.” (was “Updates are not allowed on released part revisions.”).

2026-06-06

  • Fix: EngineeringChangeOrder.partRevisions now resolves the related part revisions. The field previously returned the join records and errored when selecting fields such as revisionName.

2026-06-04

  • Attachment.text is now empty for newly created file attachments. File attachments use an internal storage key that is not exposed; read the file name from title. Existing file attachments are unaffected.

2026-05-07

  • Fix: Attachment.position is now nullable. The underlying column is nullable, so the field was incorrectly declared non-null and caused query failures for attachments without a position.

2026-05-06

  • QualityControlRecord.warehouse is now non-null. Quality control records always reference a live warehouse and are destroyed alongside the warehouse.
  • Deprecate QualityControlRecord.denormalizedWarehouse and QualityControlRecord.denormalizedWarehouseZone. Use warehouse and warehouseZone instead. The deprecated fields still resolve to the live records for backward compatibility. Deprecated fields will be removed after October 20th 2026.

2026-04-23

  • Add recordId field to PurchaseOrder.
  • Add account, approvedAt, billToAddress, committedAt, and title fields to PurchaseOrder.
  • PurchaseOrder.activityRecords now returns a more complete set of activity records for the purchase order.
  • Deprecate the purchase field on PurchaseOrder and PurchaseItem. The Purchase type is being removed from the API after October 20th 2026.
  • Fix: partParameterFields query no longer errors for non-option-type fields. options resolves to an empty connection for String, Boolean, Number, and SI Number parameter types.

2026-04-08

  • Add standardCostUpdate mutation to update standard cost attributes on a part.

2026-03-16

  • Add filter support on association fields for:
    • Account (attachments)
    • Build (attachments)
    • EngineeringChangeOrder (participants, affectedParts, reasons, partRevisions)
    • EngineeringChangeRequest (participants, affectedParts, reasons)
    • Part (customParameters, images, partAlternatives)
    • PartRevision (customParameters)
    • PartType (children)
    • QualityControlRecord (derivedQualityControlRecords, ancestors, bins)

2025-10-28

  • Fix: Change Subpart.quantity type to Float (was Integer).

2025-10-19

  • Fix: Rename parttypeId to partTypeId on partUpdate mutation.

2025-10-13

  • Deprecate discussionComments field for several object types.
  • Add category field to ActivityRecord.
  • Include comments in the unified activityRecords field.
  • Implement activityRecord support for:
    • Build
    • Contact
    • Customer
    • Manufacturer
    • Part
    • PartRevision
    • PurchaseOrder
    • Purchase
    • QuoteRequest
    • Unit
    • Vendor