Skip to main content
Products

The Price Filter Now Applies to Every Merchant and Every Cached Result

  • filters.price is now enforced when a response is built, not only inside the search that produced it. A result that was produced and cached before the bound was enforced is still bounded when it is served, and so is a status poll on an older job.
  • The bound now applies to every merchant. Previously it was enforced only for global search and for merchants searched through the shared shopping index; merchants with their own search method forwarded the bound and returned whatever came back.
  • An item priced in a currency other than filters.price.currency is returned rather than dropped. An item whose price never resolved is returned under a maximum-only bound but cannot satisfy a minimum. Everything Henry can compare is enforced.
  • Unchanged: both bounds stay inclusive, and an enforced page may contain fewer than limit results — page until nextCursor is null rather than until a page comes back short.
Products

Product Search Now Enforces the Price Filter

  • filters.price.min / filters.price.max are now enforced on the prices Henry returns. The upstream shopping index treats its own price parameters as advisory and regularly ignores them, so a capped search could return products above the cap; the bound is now applied again after the search runs. This covers global text search and merchants searched through that shared index — merchants with their own search method continue to use the merchant’s own price filter.
  • Where a product is offered by several sellers, a bounded search now resolves to the first offer that satisfies the bound rather than to whichever offer happened to be listed first. This applies to a floor as well as a cap. Searches with no price filter keep their existing ordering and their existing offer.
  • A bound is only compared against prices in the same currency. Set filters.price.currency to match the market you are searching; an item priced in a different currency is returned rather than dropped, so a USD cap will not empty a page of JPY results.
  • Both bounds are inclusive. Because the filter is applied after the search runs, a page may contain fewer than limit results — page until nextCursor is null rather than until a page comes back short, the same contract filters.supportedOnly already follows.
Products

Per-Variant Prices and a Discontinued State on Product Details

  • Each value in the Product Details options tree can now carry its own price and originalPrice. Variants of one product do not always share a price, and the product-level price is the lowest in-stock figure — read per-variant prices from the option tree and fall back to the product-level price when a value carries none. One details call on the base product URL returns the whole tree.
  • availability has a new value: discontinued. It means the merchant no longer offers the product, or the specific variant your link names — unlike out_of_stock, it is permanent, so drop the row instead of re-polling. A discontinued response carries no price, sku, or images; Henry never substitutes a surviving variant’s figures for one the merchant removed. The options tree still lists what is sold now.
  • Product Search’s default sold-out filter (includeOutOfStock: false) now also drops discontinued products.
CartCheckout

Checkout Details Returns Estimated Tax

  • POST /cart/{cartId}/details now returns costs.tax — an estimated sales tax for the shipping address, included in costs.total.
  • The estimate matches the “Estimated Taxes” line in the hosted checkout, so you can present a full landed cost before checkout.
  • It is a destination-based estimate; the merchant’s exact tax is only final at their own checkout. tax is absent when no estimate could be produced.
Pricing

Lower Credit Costs for Product Details and Checkout Details

  • Product Details now costs 1 credit per request (down from 2).
  • Checkout Details now costs 1 credit per request (down from 5).
  • No action needed — the new rates apply to all requests going forward. See Pricing for the full per-request table.
Products
v1.14.0
  • Product Search no longer returns products the merchant reports as out of stock.
  • Only an explicit out-of-stock state is dropped. Products whose availability is unknown, and products that are limited_stock, preorder, or backorder, are still returned.
  • For merchants served from Henry’s search index, limit now counts products you can actually buy. For Shopify catalog merchants the filter runs after the page is cut, so a page may contain fewer than limit results — page until nextCursor is null rather than until a page comes back short.
  • Pass filters.includeOutOfStock: true on a merchant search to get the previous behavior. See Product Discovery for details.
  • The includeOutOfStock filter is typed in @henrylabs/sdk@1.14.0 and @henrylabs/mcp@1.14.0.
Dashboard

Configurable Buyer Emails for Orders

  • Each buyer email Henry sends about an order — order received, order complete, partial fulfillment, and order failed — can now be switched on or off per app in the dashboard (Settings → App → General → Notifications).
  • Every email defaults on, including the new order-complete email sent when every item in the order is purchased.
Webhooks

Webhooks Now Fire for Guest Hosted-Checkout Orders

  • Fixed: orders placed through the hosted checkout by buyers who weren’t logged in to a Henry account never fired the cart’s configured webhook events (order.purchase.*, order.item.*, order.update.*). Webhook delivery no longer depends on the buyer having an account - if your cart sets settings.events, you get the events for every order, guest or not.
  • Loyalty triggers (points and tiers) still require a buyer account and are skipped for guest orders, since there is no account to credit.
Merchants
v1.13.0

Affiliate Rates on Merchants

  • Merchant List and Merchant Retrieve now return an affiliate object with maxCommissionRate — the highest commission rate Henry’s affiliate coverage pays on that merchant, as a percentage of order value - so you can decide which merchants to promote. Omitted for merchants without affiliate coverage. See Merchants for details.
Products
  • Product Details results now include an affiliateLink — a monetized, Henry-branded URL (api.henrylabs.ai/v1/go/...) that redirects through the affiliate network to the product - whenever one of Henry’s affiliate networks covers the merchant. Commissions from purchases made through it attribute to your app.
  • Hand affiliateLink to end-users to click; keep passing the plain link field to API calls. See Product Discovery for details.
  • Product Details now rejects affiliate/tracking URLs in link (wild.link and other network redirect domains) with a validation error, since products can only be resolved from merchant URLs.
Merchants

Discover Search Filters per Merchant

  • merchants.retrieve now returns searchFilters - the variant-option filter axes (option name → display values) that merchant-scoped product search accepts for that merchant, e.g. { "size": ["XS", "S", "M"], "color": ["Black", "White"] }.
  • Pass any discovered value straight into the options filter on merchant search. Matching stays case-insensitive and best-effort - honored for merchants served from Henry’s search index.
  • searchFilters is null until the merchant’s catalog has been indexed; the summary refreshes with the weekly catalog sync. See Merchants for details.
SDK

Full SDK Coverage for Card and Merchant Endpoints

  • The TypeScript SDK (@henrylabs/sdk) now exposes first-class methods for every public endpoint: a new card resource (card tokenization and CVC update - previously raw-request only) plus merchants.retrieve and the new merchants.search.
  • Available in @henrylabs/sdk@1.13.0 and @henrylabs/mcp@1.13.0.
Merchants
  • New GET /v1/merchants/search endpoint: free-text merchant search over name and host (case- and accent-insensitive partial match), with prefix matches ranked first. Built for typeaheads - one ranked page (limit 1-50, default 10), no pagination. Results carry the full merchant payload including per-method coverage, ready to scope a merchant product search. See Merchants for details.
  • Fixed: the name filter on Merchant List now partial-matches as documented (it previously required an exact, case-insensitive match).
Products
v1.12.0
  • Merchant-scoped product search now accepts an options filter with variant name → value pairs, e.g. { "size": "M", "color": "black" }.
  • Values are case-insensitive and accept either the option value the merchant displays ("M", "29", "black") or the merchant’s own option code as returned by Product Details ("size-6000", "color-001") - both match the same products.
  • Best-effort, like price and sortBy on merchant search - honored for merchants served from Henry’s search index; ignored by live search methods. See Product Discovery for details.
Merchants

Per-Method Merchant Coverage

  • Merchant List and Merchant Retrieve now return a coverage object with a status per method - checkout, checkoutDetails, productDetails, and productSearch, each supported, testing, or unsupported - so you can gate features per capability instead of relying on one merchant-wide status. See Merchants for details.
  • New per-method filters on Merchant List: checkoutCoverage, checkoutDetailsCoverage, productDetailsCoverage, and productSearchCoverage.
  • The top-level coverageStatus field and filter are now deprecated aliases of coverage.checkout / checkoutCoverage. They keep working exactly as before - no action required - but prefer the new fields going forward.
CartCheckout

Expired security codes fail fast

  • cart.checkout.purchase now returns a 400 up front when the stored card’s security code has lapsed, instead of queueing an order that could only fail at payment time. Re-collect the code with the CVC Element (or POST /card/{cardToken}/cvv server-side) and retry with the same cardToken.
  • Purchasing with an unknown cardToken now returns a 404 instead of a server error.
ProductsDashboard
v1.11.0
  • Global search results are now ranked by merchant checkout coverage - products from supported merchants come first, then testing, then unsupported. Passing sortBy keeps your explicit price ordering instead.
  • New supportedOnly filter on global text and image search returns only products from checkout-supported merchants. It’s applied after the search runs, so a page may contain fewer than limit results. See Product Discovery for details.

Buyer Emails

  • Set a per-app support email in the dashboard (Settings → App) - it becomes the reply-to address and support contact on buyer-facing transactional emails, falling back to your team contact email.
  • The order failure email is now configurable per app (Settings → App → Notifications): keep recovery links so buyers can finish failed purchases on the merchant’s site (default), or send a plain failure notice to keep buyers in your app.
CartOrders
v1.10.0

Service Fee Fields

Breaking change. Service fee fields have been renamed for consistent terminology across the platform:
  • cart.create settings: commissionFeeFixed is now serviceFeeFixed, and commissionFeePercent is now serviceFeePercent.
  • Completed order results: costs.commissionFee is now costs.serviceFee across purchase status responses, order listings, and webhook payloads.
Action required. Update your integration to the new field names. Carts created with the previous names no longer apply your configured service fee - they use your app’s default instead - so migrating promptly ensures your fee settings stay in effect.Order history is unaffected: past orders return costs.serviceFee as well. The new field names are available in @henrylabs/sdk@1.10.0 and @henrylabs/mcp@1.10.0 - upgrade alongside your integration changes.
CartCheckoutOrdersProducts

Cart

  • The default cart service fee is now 0% (previously 5%). New carts are created with no service fee unless you explicitly set one.

Checkout

  • Checkout details now return a single, unified data result shape across methods - easier to parse and consistent regardless of the underlying merchant.
  • Added shipping cost estimation, so you can surface expected shipping before a purchase completes.
  • Faster checkout page load and clearer inline form validation messages.

Orders

  • Completed order results may now return null for tax and shipping when a merchant doesn’t itemize them, instead of failing validation.

Merchant Coverage

  • Expanded supported merchants for product search and details, including UNIQLO, Gap, Banana Republic, Mango, Nike, DSW, and Fashion Nova.
Cart
v1.5.0
  • Cart items now accept an optional affiliateProductLink field on cart.create, cart.item.add, and cart.item.update. Pass your partner tracking URL and Henry will use it for fulfillment while keeping the original link as the canonical product reference.
  • affiliateProductLink is also returned on purchase responses (cart.checkout.pollPurchase) and order list items, so you can reconcile attribution end-to-end.
  • If affiliateProductLink is omitted, Henry falls back to link - existing integrations are unaffected.
  • Available in @henrylabs/sdk@1.5.0.
Cart
v1.4.0

Cart Fetch

  • Added cart.fetch(cartId, { buyer? }) to retrieve a single cart by ID and optionally prefill buyer details in the returned checkoutUrl for hosted checkout.
  • Available in @henrylabs/sdk@1.4.0.
ProductsCart
v1.3.0

Product Discovery

  • products.search now supports merchant-scoped search via type: 'merchant', alongside existing text and image search.
  • mode: 'sync' added across products.search, products.details, and cart.checkout.purchase - wait up to 30s for results inline instead of polling.

Cart

  • cart.create settings now accept the full settings.events trigger model, including webhook, email, points, and tier actions with optional conditionals.
  • Released in @henrylabs/sdk@1.3.0.
SDK
v1.2.1

SDK

SDK
v1.1.2

SDK

SDKClient SDK
v1.0.0

Henry SDK v1

  • Shipped @henrylabs/sdk@1.0.0 - the stable TypeScript server SDK for product discovery, universal cart, checkout, and orders.
  • Cart creation now returns a ready-to-use checkoutUrl alongside cartId - no separate session step needed.
  • Unified async pattern (refId + poll*) across product search, product details, and headless checkout, with a new mode: 'sync' option to wait up to 30s inline.

Client SDK (Browser)

  • Introduced @henrylabs/js@1.0.0 - a framework-agnostic browser SDK for embedding checkout directly into your frontend.
  • Henry.createCheckoutElement(...) drops a buy-now button and modal onto any page with display modes for full, compact, comfortable, bubble, and direct.
  • Henry.createCardElement(...) renders an isolated iframe for PCI-safe card capture and returns a cardToken for server-side use with headless checkout.
v0.25.0

MCP Improvements

  • Added initial server instructions for MCP.

Bug Fixes

  • Fixed a memory leak related to abort signals in the client.
  • Fixed an issue where abort listeners were removed too early.
  • MCP no longer falls back to baseUrl when the environment variable is set.
  • Correctly defined the false enum type.
v0.24.0

Improvements

  • Merged staging into main.

Bug Fixes

  • Fixed MCP installation instructions for remote servers.
  • MCP now allows fallback behavior for required environment variables.
ProductsMCP
v0.22.1

Transaction Fee on Checkout

  • Charge users a transaction fee on checkout. This fee is applied to the total order amount. Currently for Enterprise customers only.

Saved Shipping Addresses for Guest Users

  • Now guest users can save multiple shipping addresses

Checkout MCP

  • Bug fixes and performance improvements
Products
v0.22.0

Concurrent Enrich & Variant Check Requests

  • Enrich and check variants in parallel, with up to 50 concurrent requests.
  • Now possible to batch enrich and check variants

Improved Product Search Filtering

  • Updated product text and image search parameters to include additional filters and sorting options.
  • Filter by brand, merchant, min/max price, sale status, and more.
  • Scope searches to country and region (Ex. us, Austin, Texas)
  • Sort results by relevance and price
CartCheckoutProducts
v0.22.0

Multi-Cart Checkouts

  • Checkout multiple items at once with our multi-cart checkout flow. Multi-cart checkout will work automatically without any code changes.
  • Users can add items to cart from any supported merchant, and they will be checked out together. Adding multiple items in a single request is currently experimental.

Save Additional Addresses & Payment Methods

  • Save additional address and payment methods for your users, making it easier than ever to place orders.
  • This feature is released along side with a visual refresh of our hosted checkout page.

Enrich Top-k Products

  • Now automatically enrich top-k products returned from Text Product and Image Product searches.
CheckoutOrders
v0.21.1

Custom Themes

  • In addition to adding your brand assets to emails and our hosted checkout page, you can now customize the color scheme of our checkout page and purchase confirmation email.

Order Management

  • Query all orders for a given user using our new Order List endpoint
ProductsCheckoutOrders
v0.18.0

Product Discovery

  • Introducing reverse image search. Search through 2b+ SKUs, enabling more intuitive and visual shopping experiences in your app.

Hosted Checkout

  • Added iFrame support with cookie-free checkout. Embed the checkout experience directly in your app without worrying about third-party cookie restrictions or cross-origin limitations.

Programmatic Email Inbox

  • All transactional emails, order confirmations, shipping updates, newsletters, and more are now captured and stored.
  • Query and access your users’ merchant emails programmatically, giving you full control to build custom order tracking, notifications, and support experiences.
CheckoutProducts
v0.17.0

Global Region Support

  • Now, allow users from anywhere in the world to route checkouts through Henry Labs
  • Initial support is for EU and UK regions in addition to existing US support. Wider global support coming soon

Product Enrichment Endpoints

  • Introduced Product Enrichment Endpoints, allowing you to get product price, variant information, stock availability for a product given its link
  • Endpoint is currently Experimental, with availability reserved for Plus Plan customers and above

API Playground

  • Added new API Playground for Sandbox and Production environments. Get started here
  • Intended for developers trying out our APIs. It’s recommended to save the Directory link to keep your documentation up to date with our latest API changes
Products
v0.15.0

Basic, Standard, and Plus Plans

  • Rolled out self-serve subscription plans for customers of all sizes.
  • No matter what stage your business is in, Henry Labs has a plan for you. Build embedded shopping experiences in your app today.

AI Agent in Quickstart Demo

Orders
v0.14.0

Enterprise Pro Plan

  • Introduced Enterprise Pro Plan, with full access to headless checkout, bespoke API features, 24/7 support, and more. For more information contact support@henrylabs.ai.

Email Whitelabeling

  • Email domain whitelabeling has been rolled out in production. Route merchant emails through your own domain, allowing you to control the end-to-end customer experience without comprimising user trust or ever managing returns.
CheckoutProductsWallet
v0.13.0

Checkout & Payment Experience

  • Visual refresh. Updated payment card designs, icons, dropdowns, and more.
  • Improved UI for CVV updates, payment method management, and shipping address autocomplete.

Product Search & Quickstart Demo

  • Expanded product details API to include reviews, video, stars, similar products, and related searches.
  • Quickstart Demo now renders new product details on demo.henrylabs.ai.

Hosted Checkout Whitelabeling

  • Add your brand logo to the hosted checkout modal.
OrdersCheckout
v0.12.0

Henry Managed Accounts

  • Introducing Henry Managed Accounts. Unlock the power of user merchant accounts fully managed by Henry Labs.
  • Track post-order states (shipping, returns, etc) so you can provide your customers real-time order updates.
  • Whitelabel merchant emails, build trust with your customers, and have full control over the E2E user experience.
  • Managed accounts are rolling out to all supported merchants

Hosted Checkout

  • Hosted checkout now supports updating CVV at point of checkout
Products
v0.11.0

Product Discovery

  • The result of variant checks is now reflected in our Hosted Checkout page

Henry Shopping SDK (TypeScript)

  • Introducing the Henry Shopping SDK, making it easier than ever to start building (Python SDK coming soon)

Henry MCP Server

  • Add an end-to-end embedded commerce stack to your agent application with less than 10 lines of code
CartWalletProducts
v0.10.0

Universal Cart

  • POST /cart/items now accepts affiliateProductLink, letting you pass through your partner tracking links end-to-end.
  • Added the optional checkVariantAvailability parameter so carts can auto-check the selected variant’s inventory when items are added. Feature is currently experimental.
  • Introduced a “blocklist” mode that allows any product to be added to cart and checked out except for those explicitly blocked.

Wallet

  • Added guest card collection mode for /wallet/cart-collect

Product Discovery

  • Released experiemental variant check endpoints. Use them to check real time stock availability of variants.

Henry Dashboard

  • Added staging vs. production environment flag to dashboard.

Miscellaneous

  • Added unified generated documentation at api.[sandbox].henrylabs.ai/docs