Releases: merge-api/merge-node-client
v4.0.3
v4.0.2
Merge Node SDK Release Notes - Version [4.0.2]
Improvements
- Accounting: Added isBillable field to invoice line items — You can now read and write the isBillable property on InvoiceLineItem and InvoiceLineItemRequest, indicating whether a line item can be charged to the client/customer.
- Accounting: Added isActive filter to projects list — The projects.list() endpoint now supports an optional isActive parameter to filter projects by their active status.
v4.0.1
Merge Node SDK Release Notes - Version [4.0.1]
Improvements
- Added linkedDestinationId to HRIS Link Token creation: You can now optionally specify a linkedDestinationId when creating a link token via client.hris.linkToken.create(). This allows you to tie a Linked Account to a specific linked
destination by passing its UUID.
v4.0.0
Merge Node SDK Release Notes - Version [4.0.0]
Release Date: [2026-03-11]
This release includes support for all of the latest updates to the Merge API. For more information, see https://www.merge.dev/changelog
Breaking Changes
Pagination API Overhaul:
All list() methods now return Page instead of HttpResponsePromise. The new Page object supports async iteration, built-in next page fetching, and direct access to the raw response.
// v3.x
const result = client.accounting.invoices.list({ accountId: "..." });
const response = await result;
const items = response.results; // access paginated list directly
// v4.x
const page = await client.accounting.invoices.list({ accountId: "..." });
const items = page.data; // array of items on current page
const fullResponse = page.response; // full PaginatedInvoiceList object
const raw = page.rawResponse; // raw HTTP response
// Check and fetch next page
if (page.hasNextPage()) {
const nextPage = await page.getNextPage();
}
// Or iterate through all pages automatically
for await (const item of page) {
console.log(item);
}
Expand Parameter Type Changes:
Expand parameters changed from large string union types to individual enum items that accept a single value or an array. Old union combination types (e.g. "company,addresses,phone_numbers") have been removed.
// v3.x - Single combined string union
const contacts = await client.accounting.contacts.list({
expand: "company,addresses,phone_numbers"
});
// v4.x - Single value or array of individual items
const contacts = await client.accounting.contacts.list({
expand: ["company", "addresses", "phone_numbers"]
});
// Single expand still works
const contacts = await client.accounting.contacts.list({
expand: "company"
});
Affected types: All *ListRequestExpand and *RetrieveRequestExpand types have been replaced with *ListRequestExpandItem and *RetrieveRequestExpandItem equivalents across Accounting, ATS, CRM, HRIS, Ticketing, and File Storage modules.
Improvements
New Accounting Resources
- Sales Orders (client.accounting.salesOrders) - Full CRUD with list, create, retrieve, bulk create, and remote field classes support.
- Item Fulfillments (client.accounting.itemFulfillments) - Complete resource for managing item fulfillments with the same full operation set.
Bulk Operations Support
New bulk create and retrieve operations across major accounting endpoints including Invoices, Expenses, Sales Orders, and Item Fulfillments.
// Initiate a bulk create operation
const bulkResult = await client.accounting.invoices.bulkCreate({
batchItems: [{ model: invoiceData1 }, { model: invoiceData2 }],
});
// Retrieve batch operation results
const batchResults = await client.accounting.invoices.bulkRetrieve(batchId);
Typed Batch Status Enums
Batch operation status fields are typed with proper enums:
- BatchObjectStatusEnum: PENDING, SUCCESS, FAILURE
- BatchObjectsResponseStatusEnum: ENQUEUED, IN_PROGRESS, PARTIAL_SUCCESS, SUCCESS, FAILED, RATE_LIMITED
Notes
The method field on DataPassthroughRequest in the Accounting module has been narrowed from MethodEnum | string to MethodEnum, aligning it with the other five modules (ATS, CRM, HRIS,
Ticketing, File Storage) which already used MethodEnum directly. Enum validation at runtime continues to accept any strings, so this is a TypeScript compile-time change only.
Thank you for using Merge SDKs!
v4.0.0-alpha.1
Merge Node SDK Release Notes - Version [4.0.0-alpha.1]
Updated Bulk endpoint names to POST /<common_model>/bulk and GET /<common_model>/bulk/<batch_id> + other fixes to request/response types for all the bulk writes cases.
3.0.1
Merge Node SDK Release Notes - Version [3.0.1]
Improvements
Fixed enum validation errors for customers upgrading from v2.x by allowing unrecognized enum values, ensuring existing code using enums that are not defined in the schema continues to work without modification. This fix applies to all enum parameters across the SDK.
// v2.x - This worked fine
await accounting.trackingCategories.list({
categoryType: "LOCATION"
});
// v3.0.0 - This threw "Expected enum" error
await accounting.trackingCategories.list({
categoryType: "LOCATION" // ❌ Error: Expected enum. Received "LOCATION"
});
// v3.0.1 - This now works again
await accounting.trackingCategories.list({
categoryType: "LOCATION" // ✅ Works without errors
});
v3.0.0
Merge Node SDK Release Notes - Version [3.0.0]
Breaking Changes
Use v 3.0.1 which fixes a bug introduced in this version
-
Client Class Names:
Direct imports of resource client classes now require "Client" suffix. Main imports through the package root remain unchanged via backward compatibility aliases.
// ❌ v2.x - Direct imports no longer work
import { Activities } from "@mergeapi/merge-node-client/api/resources/ats/resources/activities/client/Client";
import { Candidates } from "@mergeapi/merge-node-client/api/resources/ats/resources/candidates/client/Client";
// ✅ v3.x - Update direct imports
import { ActivitiesClient } from "@mergeapi/merge-node-client/api/resources/ats/resources/activities/client/Client";
import { CandidatesClient } from "@mergeapi/merge-node-client/api/resources/ats/resources/candidates/client/Client";
// ✅ Main imports still work (backward compatible)
import { MergeClient, Ats, Accounting, Crm } from "@mergeapi/merge-node-client";
const client = new MergeClient({ apiKey: "your-api-key" });
const candidates = await client.ats.candidates.list();
// All existing API calls work identically
const candidates = await client.ats.candidates.list();
const accounts = await client.crm.accounts.list();
const employees = await client.hris.employees.list();
// Legacy class names still work for direct instantiation
const atsClient = new Ats({ apiKey: "your-api-key" });
const crmClient = new Crm({ apiKey: "your-api-key" });
const accountingClient = new Accounting({ apiKey: "your-api-key" });
Improvements
-
Enhanced Client Architecture
Modern BaseClient system with improved error handling, authentication providers, and better request/response processing. -
Better TypeScript Support
Improved type inference and normalized client options across all resource clients. -
Advanced Configuration Options
New support for custom timeouts, retry logic, logging configuration, and enhanced header management.
v2.2.0
Merge Node SDK Release Notes - Version [2.2.0]
This release includes support for all of the latest updates for the Merge API. For more information, see https://www.merge.dev/changelog
v2.1.3
Merge Node SDK Release Notes - Version [2.1.3]
Improvements
This release contains an update to correctly use the account token configured in category specific client initializations by default. See the below code snippet for an example:
import { ATS } from `@mergeapi/merge-node-client/api/resources/ats/clientClient';
const mergeClient = new ATS({
apiKey: 'YOUR_API_KEY',
accountToken: 'YOUR_ACCOUNT_TOKEN',
});
// now uses the account token specified in the client initialization
mergeclient.accountDetails.retrieve();
v2.1.2
Merge Node SDK Release Notes - Version [2.1.2]
Improvements
This release contains an update to add is_common_model_field to RemoteFieldClass in Accounting, CRM and Ticketing.