Skip to main content

Overview

The Kelviq Node SDK provides a convenient way to interact with the Kelviq REST APIs from your Node application.

Installation

Install the Kelviq SDK using npm or yarn:
or

Prerequisites

Before you can initialize the client and use the SDK methods, you need a Server API Key. You can obtain this key from the Kelviq application:
  1. Navigate to Settings.
  2. Go to the API keys section.
  3. Copy the Server API Key.
Security Warning: The Server API Key should never be exposed in client-side code. Use it only in your backend services. For client-side applications, use the Client API Key with the React SDK or JavaScript SDK.
Once copied, add this key to your environment variables (recommended for security):

Configuring the Client

The SDK provides a main Kelviq client class. You instantiate it directly with your configuration options.

How to Create a Client

Caching and offline resilience

Entitlement caching is enabled by default. The SDK keeps a per-process in-memory cache with a 60-second freshness window. Reads follow this order: fresh memory cache, optional distributed cache, then the Entitlement API. A successful API response refreshes both cache levels. If the API is unreachable or returns a server error, the SDK returns the last known cached entitlement response when one exists. If the customer or feature has never been cached, the original request error is thrown.
Set enableCache: false to disable caching.

Share the cache across instances

The in-memory cache and offline reporting queue belong to one Node process and disappear when it restarts. Use the optional Redis store when multiple processes or containers need one shared, durable cache and queue.
Use the same prefix for every instance that should share state.

Replay queued usage

When a usage or event report fails because of a network problem, the SDK queues it and retries automatically on the next report call. You can also flush the queue explicitly:
remaining is the number of reports still queued. Without Redis, the queue exists only in the current process. See When the Entitlement API is unavailable for access-control fallback guidance.

Supported Functionalities

The SDK currently supports the following operations:
  1. Customers
  2. Checkout
  3. Entitlements
  4. Reporting
  5. Subscriptions
  6. License
  7. Portal

Customers

The customers module allows you to manage customer records within Kelviq. You can access these operations via the customers attribute on an initialized Kelviq client instance.

Creates a new customer

Required Parameters:
  • customerId : A unique identifier for the customer that you define. This ID will be used to reference the customer in subsequent API calls.
Optional Parameters:
  • email : The email address of the customer. Must be a valid email format.
  • name : The name of the customer.
  • metadata : An object of custom key-value pairs to store additional information about the customer.
Returns: An instance of CustomerResponse (TypeScript Interface), representing the newly created customer record. Key attributes include:
  • id : The server-generated unique UUID for the customer record.
  • customerId : The client-provided customer identifier.
  • name : The customer’s name.
  • email : The customer’s email.
  • details : Any server-added details about the customer (typically read-only).
  • metadata : The metadata associated with the customer.
  • createdOn : ISO 8601 timestamp of when the customer was created.
  • modifiedOn : ISO 8601 timestamp of when the customer was last modified.

Updates an existing customer

This operation performs a partial update (PATCH), so you only need to provide the fields you want to change.
Parameters: Required Parameters:
  • customerId : A unique identifier for the customer that you define. This ID will be used to reference the customer in subsequent API calls.
Optional Parameters:
  • email : The email address of the customer. Must be a valid email format.
  • name : The name of the customer.
  • metadata : An object of custom key-value pairs to store additional information about the customer.
Returns: An instance of CustomerResponse (TypeScript Interface), representing the updated customer record. Key attributes include:
  • id : The server-generated unique UUID for the customer record.
  • customerId : The client-provided customer identifier.
  • name : The customer’s name.
  • email : The customer’s email.
  • details : Any server-added details about the customer (typically read-only).
  • metadata : The metadata associated with the customer.
  • createdOn : ISO 8601 timestamp of when the customer was created.
  • modifiedOn : ISO 8601 timestamp of when the customer was last modified.

Checkout

The checkout module provides functionalities for creating and managing checkout sessions. You can access these operations via the checkout attribute on an initialized Kelviq client instance. This operation creates a new checkout session for a customer, allowing them to proceed with a purchase or subscription.
Required Parameters:
  • planIdentifier : The identifier of the specific plan the customer is checking out with. planIdentifier is mandatory.
  • successUrl : The URL to which the user will be redirected after a successful checkout.
  • chargePeriod : The billing cycle for the subscription. Must be one of:
    • "ONE_TIME"
    • "MONTHLY"
    • "YEARLY"
    • "WEEKLY"
    • "DAILY"
    • "TWENTY_EIGHT_DAYS"
    • "THREE_MONTHS"
    • "SIX_MONTHS"
Optional Parameters:
  • offeringId : The ID (uuid) of the offering the customer is checking out with.
  • pricingTableId : The id (uuid) of the pricing table being used for this checkout. (Considered only if offeringId is not provided)
  • ruleId : The id (uuid) of the pricing rule being applied. (Considered only if offeringId is not provided)
  • customerId : The ID of the customer initiating the checkout. (If not provided, a new customer will be created)
  • features: A list of objects, where each object represents a feature and its desired quantity. Each object must have two keys:
    • "identifier" : The unique identifier for the feature.
    • "quantity": The desired quantity for this feature.
      • Example: [{"identifier": "seats", "quantity": 10}, {"identifier": "api-calls-tier1", "quantity": 5000}]
  • ipAddress : The IP Address of the customer, used for location based pricing.
  • currencyCode : The currency code for the checkout session (e.g. "USD"). Required when customAmount is provided.
  • customAmount : A custom amount to charge for this checkout session. When provided, taxBehavior and currencyCode are also required.
  • taxBehavior : Specifies how taxes are applied to the customAmount. Required when customAmount is provided. Must be one of:
    • "INCLUSIVE" — Tax is included in the custom amount.
    • "EXCLUSIVE" — Tax is added on top of the custom amount.
  • discountsEnabled : Whether the discount/coupon code field is shown on the checkout page. Defaults to true.
  • lockEmail : When true, the email field is pre-filled and locked so the customer cannot change it. Defaults to false.
  • defaultBillingCountry : ISO 3166-1 alpha-2 country code (e.g. "US", "GB") used to pre-fill the billing address country on the checkout page.
  • metadata : An object of arbitrary key-value pairs to attach to the checkout session. The keys are preserved exactly as supplied and the object is returned unchanged on the checkout.completed webhook’s metadata field. Example: { "order_ref": "ABC-123", "source": "pricing_page" }.
Returns: An instance of CreateCheckoutSessionResponse (Object), which includes:
  • checkoutSessionId : The unique ID for the created checkout session.
  • checkoutUrl : The URL that the customer should be redirected to in order to complete the payment and activate the subscription/purchase.

Entitlements

The entitlements module allows you to check and retrieve customer entitlements for various features. These operations target a specific edge API endpoint ( https://edge.api.kelviq.com by default) and use the GET HTTP method with query parameters.

Checks if a specific customer has access to a particular feature.

This method directly returns a boolean indicating access status.
Required Parameters:
  • customerId : The unique identifier for the customer.
  • featureId : The unique identifier for the feature whose access is being checked.
Returns:
  • boolean: true if the customer has access to the specified feature (considering feature type, limits, etc.), false otherwise or if the feature is not found in their entitlements.

Retrieves the aggregated entitlement for a specific feature for a given customer.

Required Parameters:
  • customerId : The unique identifier for the customer.
  • featureId : The unique identifier for the feature whose access is being checked.
Returns: An aggregated Entitlement object, or null if the feature is not found. If the customer has multiple subscriptions, there can be multiple raw entries for the same featureId. The SDK aggregates them and keeps raw entries in the items array. Note: resetAt is only available on individual items (not at the top level) because it can differ across subscriptions. The structure includes:
  • featureId: string
  • hasAccess: boolean — For METER features, computed as remaining === null || remaining > 0. For BOOLEAN and CUSTOMIZABLE features, true if at least one item grants access.
  • featureType: string — "METER", "BOOLEAN", or "CUSTOMIZABLE".
  • hardLimit: boolean | null — For METER, true if any item has a hard limit. For BOOLEAN, always false.
  • usageLimit: number | null — For METER, summed across all items. For CUSTOMIZABLE, taken from the first item. For BOOLEAN, always null.
  • currentUsage: number | null — For METER, summed across all items. For CUSTOMIZABLE, taken from the first item. For BOOLEAN, always 0.
  • remaining: number | null — For METER, computed as usageLimit - currentUsage. For CUSTOMIZABLE, taken from the first item. For BOOLEAN, always null.
  • items (EntitlementDetail[]): An array containing all raw entitlement entries for this featureId. Each item includes resetAt.

Retrieves all aggregated entitlements for a given customer.

Required Parameters:
  • customerId : The unique identifier for the customer.
Returns: A Record<string, Entitlement> keyed by featureId. If the customer has multiple subscriptions, there can be multiple raw entries for the same featureId. The SDK aggregates them and keeps raw entries in the items array. Note: resetAt is only available on individual items (not at the top level) because it can differ across subscriptions. Each Entitlement value has the same structure as described in getEntitlement above.

Retrieves the raw entitlement from the API for a specific feature.

Required Parameters:
  • customerId : The unique identifier for the customer.
  • featureId : The unique identifier for the feature.
Returns: An instance of CheckEntitlementsResponse (Object). This returns the raw API response without aggregation. The structure includes:
  • customerId : The customer’s ID.
  • entitlements (EntitlementDetail[]): A list containing raw entitlement details. Each EntitlementDetail has fields like:
    • featureId: string
    • hasAccess: boolean
    • featureType: string
    • resetAt: string
    • hardLimit: boolean | null
    • usageLimit: number | null
    • currentUsage: number | null
    • remaining: number | null

Retrieves all raw entitlements from the API without aggregation.

Required Parameters:
  • customerId : The unique identifier for the customer.
Returns: An instance of CheckEntitlementsResponse (Object). This returns the raw API response without aggregation. The structure includes:
  • customerId : The customer’s ID.
  • entitlements (EntitlementDetail[]): A list containing raw entitlement details. Each EntitlementDetail has fields like:
    • featureId: string
    • hasAccess: boolean
    • featureType: string
    • resetAt: string
    • hardLimit: boolean | null
    • usageLimit: number | null
    • currentUsage: number | null
    • remaining: number | null

Reporting

Reporting pre-aggregated usages for customer

This endpoint is used for reporting the pre-aggregated feature usage from your application (client-level) to the Kelviq application. It allows you to update the usage count for a specific feature associated with a customer.
Required Parameters:
  • value: The usage value being reported.
  • customerId : The unique identifier for the customer associated with this usage.
  • featureId : The unique identifier for the feature for which usage is being reported.
  • behaviour parameter dictates how the usage is updated:
    • SET: This will replace the current usage value for the feature with the new value provided.
    • DELTA: This will increment the existing usage value for the feature by the amount specified in the value parameter
Returns: An instance of ReportUsageResponse (Object), which includes:
  • value: The usage value that was recorded.
  • customerId : The customer ID associated with the usage.
  • featureId : The feature Identifier for which usage was recorded.
  • behaviour : The behaviour type (“SET” or “DELTA”) that was processed.
  • orgId : The organization ID associated with this record, as determined by the server.
  • eventName : An internal event name generated by the server for this usage report (e.g., “aggregated.usage”).
  • idempotencyKey : A unique idempotency key generated by the server for this specific usage report instance.
  • timestamp : The server-generated UTC timestamp (string format) indicating when the usage report was processed.

Subscriptions

The subscriptions module allows you to list, retrieve, create, update, and cancel customer subscriptions. You can access these operations via the subscriptions attribute on an initialized Kelviq client instance.

List subscriptions

Retrieves a paginated list of subscriptions for a customer.
Required Parameters:
  • customerId (string): The client-defined identifier of the customer whose subscriptions will be returned.
Optional Parameters:
  • page (number): Page number to retrieve.
  • pageSize (number): Number of subscriptions to return per page.
Returns: A PaginatedSubscriptionResponse containing count, next, previous, and a results array of SubscriptionData objects.

Retrieve a subscription

Retrieves one subscription using its Kelviq subscription ID.
Required Parameters:
  • subscriptionId (string): The Kelviq UUID of the subscription.
Returns: A SubscriptionData object. A missing subscription throws NotFoundError.

Create a subscription

Creates a subscription directly for a customer without requiring a checkout session.
Required Parameters:
  • planIdentifier (string): Identifier of the plan to subscribe to.
  • chargePeriod (ChargePeriod): By default, organizations can use MONTHLY, THREE_MONTHS, SIX_MONTHS, YEARLY, and ONE_TIME. To enable DAILY, WEEKLY, or TWENTY_EIGHT_DAYS, contact hi@kelviq.com.
  • customerId (string): Client-defined identifier of the customer.
Optional Parameters:
  • successUrl (string): URL to redirect to after successful subscription creation.
  • features (FeatureListItem[]): Feature identifiers and requested quantities.
  • ipAddress (string): Customer IP address used for location-based pricing.
Returns: A CreateSubscriptionResponse containing the created subscription, including its plan files, links, and issued licenses when available.

Updates an existing subscription to a new plan

Required Parameters:
  • subscriptionId : The unique identifier of the subscription to be updated.
  • planIdentifier : The identifier of the new plan.
  • chargePeriod : The new charging period for the subscription. Must be one of:
    • "ONE_TIME"
    • "MONTHLY"
    • "YEARLY"
    • "WEEKLY"
    • "DAILY"
    • "TWENTY_EIGHT_DAYS"
    • "THREE_MONTHS"
    • "SIX_MONTHS"
Optional Parameters:
  • offeringId : The ID of the new offering, if applicable.
  • pricingTableId : The ID of the new pricing table, if applicable.
  • ruleId : The ID of the new pricing rule, if applicable.
  • ipAddress : The IP Address of the customer, used for location based pricing.
  • features: An array of objects, where each object represents a feature and its desired quantity to update for the subscription. Each object must have two keys:
    • "identifier" : The unique identifier for the feature.
    • "quantity" : The desired quantity for this feature.
      • Example: [{"identifier": "seats", "quantity": 10}, {"identifier": "projects", "quantity": 5}]
  • trialEnd (string): Controls the trial period for the updated subscription. Accepts either:
    • The literal string "now" to end any active trial immediately.
    • An ISO 8601 datetime string (e.g. "2027-12-31T23:59:59Z") to set a new trial end date. The datetime must be in the future. Naive datetimes (no timezone designator) are interpreted as UTC.
    • If omitted, the existing trial behavior on the subscription is preserved.
  • paymentBehavior (PaymentBehavior): Set to PAYMENT_BEHAVIORS.ACTIVATE_ON_PAYMENT (the value "activate_on_payment") to keep the current subscription active while payment is pending. The new plan and features are applied only after payment succeeds. If the pending update expires, the current subscription remains unchanged. Omit this field to use the default immediate-update behavior.
The SDK validates trialEnd client-side — invalid datetime strings or past datetimes throw InvalidRequestError before the request is sent. Returns: An instance of UpdateSubscriptionResponse, which includes:
  • subscriptionId (string): UUID of the updated subscription.

Cancel an active subscription for a customer.

Required Parameters:
  • subscriptionId : The unique identifier of the subscription to be cancelled.
  • cancellationType : The type of cancellation to perform. Must be one of:
    • "IMMEDIATE": The subscription is cancelled immediately.
    • "CURRENT_PERIOD_ENDS": The subscription will remain active until the end of the current billing period and then cancel.
    • "SPECIFIC_DATE": The subscription will be cancelled on the specified cancellationDate.
  • cancellationDate : The specific date for cancellation if cancellationType is "SPECIFIC_DATE". Must be in YYYY-MM-DD format. This parameter is required if cancellationType is "SPECIFIC_DATE".
Returns: An instance of CancelSubscriptionResponse, which includes:
  • message : A confirmation message indicating the result of the cancellation request.

License

The license module allows you to activate, deactivate, and validate software licenses. You can access these operations via the license attribute on an initialized Kelviq client instance.

Activate a license key

Creates a new license instance for a given license key, optionally associating it with a customer.
Required Parameters:
  • licenseKey : The license key string to activate.
Optional Parameters:
  • customerId : The ID of the customer this instance is associated with.
  • instanceName : A human-readable name for this instance (e.g. device name).
  • metadata : An object of custom key-value pairs to attach to the instance.
Returns: An instance of LicenseActivateResponse, which includes:
  • instanceId (string): The unique ID of the newly created license instance.
  • activatedAt (string): ISO 8601 timestamp of when the instance was activated.
  • expiresOn (string | null): ISO 8601 timestamp of when the instance expires, if applicable.
  • license (LicenseDetails): The full license object. Key fields:
    • id : Server-generated UUID for the license.
    • licenseKey : The license key string.
    • activatedOn (string | null): ISO 8601 timestamp of when the license was first activated.
    • expiresOn (string | null): ISO 8601 timestamp of when the license expires.
    • activationUsage : Number of currently active instances.
    • activationLimit : Maximum number of allowed concurrent activations.
    • enabled : Whether the license is active.
    • customer (object | null): The associated customer, if any. Fields: customerId, name, email.
    • plan (object | null): The plan associated with this license, if any. Fields: identifier, name, description, version, isLatest, and product (object with id, identifier, name, taxCode, createdOn, modifiedOn).
    • subscription (object | null): Subscription details, if any. Fields: id, recurrence, billingPeriodStartTime, billingPeriodEndTime, startDate, endDate, status, amount, currency, trialDaysRemaining, billingType, recurrenceUnit, recurrenceType.

Deactivate a license instance

Deactivates a specific license instance by its instance ID.
Required Parameters:
  • licenseKey : The license key string.
  • instanceId : The unique ID of the instance to deactivate.
Returns: An instance of LicenseDeactivateResponse, which includes:
  • message (string): Confirmation message.
  • deactivatedAt (string): ISO 8601 timestamp of when the instance was deactivated.

Validate a license key

Checks whether a license key (and optionally a specific instance) is valid.
Required Parameters:
  • licenseKey : The license key string to validate.
Optional Parameters:
  • instanceId : If provided, also validates that this specific instance is active for the given license key.
Returns: An instance of LicenseValidateResponse, which includes:
  • valid (boolean): Whether the license (and instance, if provided) is valid.
  • code (string): A short status code (e.g. "VALID", "INVALID", "EXPIRED").
  • detail (string): A human-readable description of the validation result.
  • metadata (object | null): Any metadata attached to the instance, if applicable.
  • license (LicenseDetails | null): The full license object (same structure as in activate), or null if not found.

Portal

The portal module allows you to create authenticated customer portal sessions. Once a session is created, you can redirect your customer directly to their self-serve customer portal without requiring them to log in manually. You can access these operations via the portal attribute on an initialized Kelviq client instance.

Creates a new customer portal session

Required Parameters:
  • customerId : The unique identifier of the customer for whom the portal session is being created.
Returns: An instance of CreatePortalSessionResponse (TypeScript Interface), which includes:
  • token : The session token that authenticates the customer portal session.
  • email : The email address of the customer.
  • customerPortalUrl : The customer’s billing portal base URL. This URL alone does not authenticate the session — append the token as a query parameter (${customerPortalUrl}?token=${token}) to produce the signed link you share with the customer. The token expires, so create a fresh session per visit.

Webhooks

Kelviq can send real-time webhook notifications to your server when events occur in your account — for example, when a subscription is created or an invoice is paid.

Verifying webhook signatures

Every webhook request includes three headers that you must use to verify the request is genuinely from Kelviq: Use the validateEvent helper to verify the signature and parse the event in one step. It throws WebhookVerificationError if the signature is invalid.
Use express.raw() (not express.json()) so that the raw request body is preserved for signature verification. Parsing the body as JSON before verification will break the signature check.

Webhook event types

Best practices

  • Return quickly — respond with a 2xx status before doing any heavy processing. Kelviq retries up to 3 times at 60-second intervals if it does not receive a 2xx.
  • Use idempotency — use the webhook-id header (or the event id field) to detect and skip duplicate deliveries.
  • Validate every request — always verify the signature before trusting the payload.

Using the Sandbox Environment

For testing and development, you can configure the client to use the sandbox environment. This ensures that no production data is affected. To do this, set the environment option to ‘sandbox’ during client initialization.
The sandbox environment is completely separate from production. You will need to use a different set of API keys, and any data created (customers, subscriptions, etc.) will only exist in the sandbox.