-
Change: The input fields
nonIdentifiedCustomerandprintNameOnPdf, both of typeBoolean!, were added toCustomerCreateGLDtoInput. - Reason:
- These fields are required in the schema, but the server automatically assigns a default value of
falsewhen the field is not provided.
- These fields are required in the schema, but the server automatically assigns a default value of
- Impact:
- Despite being marked as non-nullable (
Boolean!), this change does not break existing integrations. - Existing GraphQL mutations that create customers without providing these fields will continue to work as before.
- Despite being marked as non-nullable (
- Solution:
- No action is required.
-
Resource: Sales Invoices
2026 May
-
Change: The input field
printNameOnPdfof typeBoolean!was added toSalesInvoiceCreateGLDtoInput. - Reason:
- This field is required in the schema, but the server automatically assigns a default value of
falsewhen the field is not provided.
- This field is required in the schema, but the server automatically assigns a default value of
- Impact:
- Despite being marked as non-nullable (
Boolean!), this change does not break existing integrations. - Existing GraphQL mutations that create sales invoices without providing this field will continue to work as before.
- Despite being marked as non-nullable (
- Solution:
- No action is required.
-
All Resources
2026 April
-
Change:
Various input fields were removed from*CreateGLDtoInputand*UpdateGLDtoInputtypes across resources. The list is not reproduced here field by field. -
Reason:
This is a global schema cleanup: those inputs exposed fields that were not aligned with what create and update operations actually support or apply, which made the contract misleading. -
Impact:
There is no practical compatibility break for integrations: the removed fields remain accepted when sent on create or update requests; they simply have no effect on how the operation is processed. -
Solution:
You may drop these fields from your payloads for clarity and to match the published schema; keeping them is harmless from a processing perspective.
-
Resource: Operational Number Preset Texts
2026 April
-
Change: The field
operationonOperationalNumberPresetTextchanged type fromStringtoOperationType(enumeration). -
Reason:
The field was incorrectly published as a string; it must reflect theOperationTypeenum. - Impact:
- Filters: There is no change to how you write filters on this field: filter inputs already used the enumeration.
- Responses: Values returned for
operationon the object are now serialized in uppercase snake case (e.g.DELIVERY_NOTE) instead of camelCase. Any client logic that compared or parsed the old string shape should be updated accordingly.
- Solution:
Rely on the enum values as returned by the API (uppercase snake case), or normalize comparisons to match the new serialization.
-
Resource: User Profile
2026 March
-
Change: The field
userIdwas removed from the object typeUserProfile. -
Reason: The field had only just been added; it duplicated the existing
idfield on the same type, so it was removed as redundant. -
Solution: Use
idinstead ofuserIdwhen you need the user identifier fromUserProfile.
-
Resource: Sales Invoices
2026 February
- Change:
- The input field
sourceIdwas removed fromSalesInvoiceLineCreateGLDtoInput. - The input field
originIdof typeUUIDwas added toSalesInvoiceLineCreateGLDtoInput.
- The input field
- Reason:
- This change is part of the introduction of the Sales Document Transformation Flow.
- The transformation flow requires both the identifier and the type of the originating document in order to correctly reference source documents and their lines.
- As part of this model, the
originTypefield was introduced to explicitly represent the business document type (Quote, Order, Delivery Note, etc.). - The existing
sourceTypefield is already used for a different purpose: identifying the technical origin of the document creation. - Keeping
sourceIdalongsideoriginTypewould have been semantically inconsistent and misleading, assourceIdwould no longer match the meaning ofsourceType. - Renaming
sourceIdtooriginIdensures a clear and consistent API contract, whereoriginTypeandoriginIdare used together to represent the business origin of transformed documents.
- Impact:
- This change is a breaking change.
- However, the risk of regression is limited, as
sourceIdwas introduced very recently. - Existing integrations that relied on
sourceIdwill need to be updated.
- Solution:
- Replace any usage of
sourceIdwithoriginId. - No other functional change is required.
- Replace any usage of
-
Resource: Products
2026 January
-
Change: The input field
useWithholdingof typeBoolean!was added toProductCreateGLDtoInput. - Reason:
- This field is required in the schema, but the server automatically assigns a default value of
falsewhen the field is not provided.
- This field is required in the schema, but the server automatically assigns a default value of
- Impact:
- Despite being marked as non-nullable (
Boolean!), this change does not break existing integrations. - Existing GraphQL mutations that create products without providing this field will continue to work as before.
- Despite being marked as non-nullable (
- Solution:
- No action is required.
-
All Resources
2025 December
- Change: The following directive arguments were updated:
temporaryPreventAccessValidationwas removed from theaccessControldirectivetemporaryPreventFeatureValidationwas removed from thefeaturedirective- The argument
filterwas added to both theaccessControlandfeaturedirectives
-
Reason:
This change is part of an internal cleanup and normalization of directive arguments in the GraphQL security and feature-flagging layer.
The legacytemporaryPrevent*arguments were transitional and are no longer required. The newfilterargument provides a more consistent and extensible mechanism to control access and feature exposure. - Impact:
- This change is schema-visible and therefore classified as a breaking change from a strict GraphQL introspection perspective.
- However, it has no functional impact on API consumers:
- No existing queries or mutations need to be modified
- No runtime behavior changes for authenticated users
- No authorization or feature access rules are affected
- Only tooling that directly inspects directive arguments for these specific names may observe the change.
- Solution:
- No action is required for standard API usage.
- If you rely on schema introspection for custom tooling or validation, simply update your logic to reflect the new
filterargument.
-
All Resources
2025 September
- Change: The
costdirective has undergone structural changes during the migration from HotChocolate v13 to v15:- The argument
weightwas added - The arguments
complexity,defaultMultiplier,multipliersandMultiplierPathwere removed
- The argument
- Reason: In HotChocolate v15, the internal cost analysis system was redesigned to simplify and standardize performance cost estimation across resolvers.
The former approach usingcomplexity,defaultMultiplier,multipliersandMultiplierPathhas been deprecated in favor of a singleweightargument that is easier to configure and interpret. This is part of a broader refactoring of the execution engine in HotChocolate to make middleware resolution and cost-based batching more predictable and performant. - Impact:
- Any custom usage or tooling that relied on the previous
costdirective arguments will break unless updated. - If you used
@cost(complexity: X)or similar in your schema extensions or stitching logic, you must now use@cost(weight: X)instead. - Existing introspection queries or documentation tools expecting the old arguments will no longer find them.
- This change reflects a breaking change in the GraphQL schema and may cause errors at runtime if clients still attempt to use the old directive structure.
- Any custom usage or tooling that relied on the previous
- Solution:
- Update all usages of the
@costdirective to conform to the new syntax introduced in HotChocolate v15. - Review all schema stitching and introspection-dependent tooling to ensure compatibility with the updated directive shape.
- Update all usages of the
-
Resource: All resources using
DateOperationFilterInput2025 September
- Change:
- Type
Datewas removed - All input fields in
DateOperationFilterInputchanged fromDatetoDateTime:eq,neq,gt,gte,lt,lte,ngt,ngte,nlt,nlteinandninchanged from[Date]to[DateTime]
- Type
-
Reason:
TheDatescalar type was used exclusively in filter operators. In Sage Active, business dates such as invoice dates or accounting entry dates use a date-only format, while system dates likecreationDateandmodificationDateuse full datetime values.In HotChocolate 13, the
Datetype in filters was permissive: it accepted bothdate-onlyanddatetimevalues, even though the time part was ignored.
In HotChocolate 15, this behavior is no longer supported. For consistency and compatibility, theDatetype has been removed from filters and replaced byDateTime. -
Impact:
Filters that passdatetimeordate-onlyvalues directly (e.g., in literals or Postman queries) will continue to work as before.
The only breaking change occurs if your GraphQL query variables were explicitly typed asDateand used to filter business dates. In this case, you must update the variable type fromDatetoDateTime.The impact should be minimal or nonexistent, as production API usage statistics show no cases where variables of type
Datewere declared for date filters. - Recommendation:
Review your client-side code and update any GraphQL variables typed asDateto useDateTime, especially if used in filters involving business dates.
-
Resource: Journal Types, Products, Suppliers, Customers
2025 May
- Change: The following input fields were removed:
accountingEntryTemplateIdfromJournalTypeCreateGLDtoInputpurchaseUnitPricefromProductCreateGLDtoInputblockDeliveryNoteEnabled,blockInvoiceEnabled, andblockOrderEnabledfrom bothSupplierCreateGLDtoInputandSupplierUpdateGLDtoInput
- Change: Several fields in the
CustomerSortInputandSupplierSortInputinput types changed type:countryAcronymfromStringOperationFilterInputtoSortEnumTypedocumentTypefromDocumentTypeFilterInputtoDocumentTypeSortInputdocumentTypeIdfromUuidOperationFilterInputtoSortEnumTypetradeNamefromStringOperationFilterInputtoSortEnumType
- Reason:
- The removed fields were part of a feature that was ultimately not implemented and never made officially available. This is a cleanup of unused elements.
- The type changes reflect a cleanup and standardization effort: sort inputs should use only sort-compatible types (
SortEnumType) and not filtering types.
- Solution:
- Ensure that no GraphQL queries rely on the removed fields. Since they were never functional, their removal has no impact on integration.
-
Resource: User Profile
2025 May
- Change: The fields
activeOrganizationId,activeTenantId, andactiveLegislationCodenow return empty values (GUID.emptyfor the first two, andnullfor the last). - Reason: These fields have not been meaningful for over a year, following a change in how organizations are authorized for a user, they can now technically belong to different tenants.
Although these fields were removed from the documentation, they remained in the API to avoid execution errors when queryinguserProfile. - Solution: Remove these fields from the
userProfilequery. They are no longer relevant and will be permanently removed in a future version.
-
Resource: Sales Documents
2025 Apr
- Change: The
sourceTypeinput field for sales document filters (SalesQuoteFilterInput,SalesOrderFilterInput,SalesInvoiceFilterInput, andSalesDeliveryNoteFilterInput) no longer acceptsnull. - Reason: Previously,
sourceTypewas nullable. Now, it always takes a value:SALESwhen the document is manually entered, andPUBLIC_APIwhen created through the API. - Solution: Update filters to explicitly set
sourceType, depending on the origin of the document.
-
Resource: Accounting Entries
2025 Feb
- Change: The dataloader
accountingEntryand the fieldaccountingEntryIdwere removed from thesalesInvoicesdataloader, which is accessible fromaccountingEntries. - Reason: While it was technically functional, exposing
accountingEntriesthrough this dataloader was redundant, as the query already originated from the accounting entry. Additionally, it introduced a circular reference issue when sales invoices contained advance payment deductions, leading to multiple accounting entries being linked to the same sales invoice. - Solution: It remains possible to access the sales invoice header from an accounting entry if it exists.
- Change: The dataloader
-
Resource: Taxes Treatment
2025 Feb
- Change: The types
AccountingAccountGLDtoandTaxTreatmentGLDtowere removed. - Reason: The list of Tax Treatments was already available through the dataloader logic, accessible from
AccountingAccount. However, the list of Tax Treatments as a standalone entity remained as a DTO, as an exception to the general rule introduced with dataloaders.
Additionally,TaxTreatmentGLDtocontained published fields that were not being used. - Solution: If you were using a field from
TaxTreatmentGLDtothat has been removed due to being unused, simply remove it from your query. No other modifications are required as the Tax Treatment list remains accessible throughAccountingAccount.
- Change: The types
-
Resource: Sales Documents
2025 Jan
- Change: Fields
xxxxchanged type fromInttoDecimal. - Reason: The January version of Sage Active introduces the ability to handle quantities with decimals in sales documents.
This results in technical breaking changes as quantities now shift fromInttoDecimal. However, this does not impact existing developments becauseDecimalsupportsInt. - Solution: No modifications are required, as compatibility is maintained.
- Change: Fields
-
Resource: Purchase Invoices
2024 Dec
- Change: The input field
taxGroupIdwas removed from the input object typePurchaseInvoiceLineCreateGLDtoInput. - Reason: The API schema has been updated to simplify the handling of tax groups, ensuring a more streamlined and consistent data structure for purchase invoice lines.
- Solution: Remove any references to the
taxGroupIdfield in your Purchase Invoices mutations.
- Change: The input field
-
Resource: Purchase Invoices
2024 Nov
- Change: The input field
lineswas removed from the input object typePurchaseInvoiceCreateGLDtoInput. The input fieldvatLinesof type[PurchaseInvoiceLineCreateGLDtoInput!]!was added instead. - Reason: The structure of the purchase invoice creation process has been improved to better handle VAT lines separately, providing more clarity and precision in the data model.
- Solution: Update your queries and mutations by replacing references to the
linesinput field with the newvatLinesinput field.
- Change: The input field
-
Resource: Organizations
2024 Oct
- Change: The
statusfield of organizations is no longer relevant and should not be used to check the status of organizations. - Reason: Access permission management for an organization now depends on business management, which allows, for example, the termination of a business’s use. Additionally, the
statusfield always returns the valueREADY, making it meaningless for determining an organization’s status. - Solution: Either remove the
statusfield if it was referenced in queries onorganization, or, if kept, ensure that its returned value is no longer taken into account.
- Change: The
-
Resource: SalesInvoice Post Sales Invoice, Sales Open Items settlement
2024 Oct
- Change: The
Idfield in response use by PostSalesInvoice service and SalesOpentItemSettlment service is removed and change byaccountingEntryId. - Reason:
accountingEntryIdindicates that it is the ID of the accountingEntry and not Id of SalesInvoice. - Solution: Simply replace the
Idfield by theaccountingEntryIdfield when it was referenced in actions onPostSalesInvoiceorSalesOpenItemSettlement.
- Change: The
-
Resource: Userprofile
2024 Sept
- Change: The
expirationDatefield is removed fromuserprofile. - Reason: Access permission management for users now depends on business management, which allows, for example, managing the role of a user.
- Solution: Simply remove the
expirationDatefield if it is referenced in queries onuserprofile.
- Change: The
-
Resource: Products
2024 May
- Change: The
commentsfield length has been reduced from 65536 characters to 250. - Reason: This change was implemented to mitigate performance impact risks if large volumes are added.
- Solution: Ensure during the creation and modification of products that the length of comment values does not exceed 250 characters. Replace overly lengthy content with a hyperlink that leads to a page displaying detailed comments.
- Change: The
-
Resource: Sales Documents
2024 May
- Change: The
mainAddressanddeliveryAddressfor salesDocuments were previously exposed as arrays. Now, they are presented in a simple format. - Reason: These objects contained only one element, and simplifying their structure facilitates filtering, such as retrieving sales quotes from clients in Brussels.
- Solution: When retrieving data, remove the index [0].
For example, usesalesQuoteNode.mainAddressinstead ofsalesQuoteNode.mainAddress[0].
- Change: The
-
Resource: Sales Documents
2024 May
- Change: The
idfield has been removed frommainAddressanddeliveryAddressin salesDocuments because it contained a non-significant value. - Reason: This change was made to streamline the data structure, as the
idwas not providing useful information. - Solution: Remove the
idfield from queries involvingmainAddressanddeliveryAddress.
- Change: The
-
Resources: Customers, Suppliers
2024 May
- Change: The
defaultAccountingAccountIdfield inCustomersandSuppliersis no longer filterable or sortable. - Reason: The introduction of dataloaders has currently prevented filtering on this field, which was possible in previous versions. A solution is being studied for a future version.
- Solution: Remove the filter or sort from the query and perform local filtering on the response data.
- Change: The
-
Resource: All Resources
2024 May
- Change: In the syntax of queries using fragments, the DTO used to qualify fragment fields is no longer compatible due to the transition to data loaders.
- Reason: This update is part of a move to simplify query writing and to enhance performance with the use of data loaders.
- Solution: Replace the DTO name in the fragment syntax with the name of the resource in singular form, starting with a capital letter.
Example for a queryusers,fragment UserProps on UserGLDtobecomesfragment UserProps on User.
-
Resource: Other removed fields
2024 May
- Changes: All of these fields are
salesQuotes->actionsalesOrders->actionsalesDeliveryNotes->actionsalesInvoices->actionsalesTariffs->calculationBasesuppliers/thirdCollectorNamepaymentMeans->inactivepaymentMeans->paymentMethodIdpaymentMeans->paymentMethodReferenceNameorganizations->isDefaultDeliveryAddressorganizations->isDeliveryAddressorganizations->isMainAddresszipcode->code
- Reason: These fields were historically present but became inconsistent with the developments in Sage Active. They have been removed to avoid the implication that they may contain incoherent data.
- Solution: Remove these fields from queries and modify the code responsible for retrieving data from the affected queries.
- Changes: All of these fields are
-
Resource: User Profile
2024 April
- Change: The
activeOrganizationIdfield no longer returns the current user’s active organization in Sage Active, but instead returns the first organization assigned to the user. - Reason: The information returned was no longer relevant, leading to its removal from the documentation, though the field still exists to prevent query errors.
- Solution: Manage the current user’s organization in a local cache to retrieve it upon the user’s next login.
- Change: The
- Change: The
- Change: The fields
- Change: The following input fields were removed:
- Change:
- Change: The
- Change: The following directive arguments were updated:
-
- Change:
-
-
-
-