Products
The Price Filter Now Applies to Every Merchant and Every Cached Result
filters.priceis 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.currencyis 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
limitresults — page untilnextCursoris null rather than until a page comes back short.
Products
Product Search Now Enforces the Price Filter
filters.price.min/filters.price.maxare 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.currencyto 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
limitresults — page untilnextCursoris null rather than until a page comes back short, the same contractfilters.supportedOnlyalready follows.
Products
Per-Variant Prices and a Discontinued State on Product Details
- Each value in the Product Details
optionstree can now carry its ownpriceandoriginalPrice. Variants of one product do not always share a price, and the product-levelpriceis the lowest in-stock figure — read per-variant prices from the option tree and fall back to the product-levelpricewhen a value carries none. One details call on the base product URL returns the whole tree. availabilityhas a new value:discontinued. It means the merchant no longer offers the product, or the specific variant your link names — unlikeout_of_stock, it is permanent, so drop the row instead of re-polling. Adiscontinuedresponse carries noprice,sku, orimages; Henry never substitutes a surviving variant’s figures for one the merchant removed. Theoptionstree still lists what is sold now.- Product Search’s default sold-out filter (
includeOutOfStock: false) now also dropsdiscontinuedproducts.
CartCheckout
Checkout Details Returns Estimated Tax
POST /cart/{cartId}/detailsnow returnscosts.tax— an estimated sales tax for the shipping address, included incosts.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.
taxis absent when no estimate could be produced.
Pricing
Sold-Out Products Excluded From Search
- 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, orbackorder, are still returned. - For merchants served from Henry’s search index,
limitnow counts products you can actually buy. For Shopify catalog merchants the filter runs after the page is cut, so a page may contain fewer thanlimitresults — page untilnextCursorisnullrather than until a page comes back short. - Pass
filters.includeOutOfStock: trueon a merchant search to get the previous behavior. See Product Discovery for details. - The
includeOutOfStockfilter is typed in@henrylabs/sdk@1.14.0and@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 setssettings.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.
Affiliate Rates on Merchants
- Merchant List and Merchant Retrieve now return an
affiliateobject withmaxCommissionRate— 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
Affiliate Links in Product Details
- 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
affiliateLinkto end-users to click; keep passing the plainlinkfield to API calls. See Product Discovery for details. - Product Details now rejects affiliate/tracking URLs in
link(wild.linkand other network redirect domains) with a validation error, since products can only be resolved from merchant URLs.
Merchants
Discover Search Filters per Merchant
merchants.retrievenow returnssearchFilters- 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
optionsfilter on merchant search. Matching stays case-insensitive and best-effort - honored for merchants served from Henry’s search index. searchFiltersisnulluntil 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 newcardresource (card tokenization and CVC update - previously raw-request only) plusmerchants.retrieveand the newmerchants.search. - Available in
@henrylabs/sdk@1.13.0and@henrylabs/mcp@1.13.0.
Merchants
Merchant Search
- New
GET /v1/merchants/searchendpoint: 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 (limit1-50, default 10), no pagination. Results carry the full merchant payload including per-methodcoverage, ready to scope a merchant product search. See Merchants for details. - Fixed: the
namefilter on Merchant List now partial-matches as documented (it previously required an exact, case-insensitive match).
Option Filters on Merchant Search
- Merchant-scoped product search now accepts an
optionsfilter 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
priceandsortByon 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
coverageobject with a status per method -checkout,checkoutDetails,productDetails, andproductSearch, eachsupported,testing, orunsupported- 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, andproductSearchCoverage. - The top-level
coverageStatusfield and filter are now deprecated aliases ofcoverage.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.purchasenow 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 (orPOST /card/{cardToken}/cvvserver-side) and retry with the samecardToken.- Purchasing with an unknown
cardTokennow returns a 404 instead of a server error.
Product Search
- Global search results are now ranked by merchant checkout coverage -
products from
supportedmerchants come first, thentesting, thenunsupported. PassingsortBykeeps your explicit price ordering instead. - New
supportedOnlyfilter 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 thanlimitresults. 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.
Service Fee Fields
Breaking change. Service fee fields have been renamed for consistent terminology across the platform:cart.createsettings:commissionFeeFixedis nowserviceFeeFixed, andcommissionFeePercentis nowserviceFeePercent.- Completed order results:
costs.commissionFeeis nowcosts.serviceFeeacross purchase status responses, order listings, and webhook payloads.
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
dataresult 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
nullfortaxandshippingwhen 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.
Affiliate Product Links
- Cart items now accept an optional
affiliateProductLinkfield oncart.create,cart.item.add, andcart.item.update. Pass your partner tracking URL and Henry will use it for fulfillment while keeping the originallinkas the canonical product reference. affiliateProductLinkis also returned on purchase responses (cart.checkout.pollPurchase) and order list items, so you can reconcile attribution end-to-end.- If
affiliateProductLinkis omitted, Henry falls back tolink- existing integrations are unaffected. - Available in
@henrylabs/sdk@1.5.0.
Cart Fetch
- Added
cart.fetch(cartId, { buyer? })to retrieve a single cart by ID and optionally prefill buyer details in the returnedcheckoutUrlfor hosted checkout. - Available in
@henrylabs/sdk@1.4.0.
Product Discovery
products.searchnow supports merchant-scoped search viatype: 'merchant', alongside existing text and image search.mode: 'sync'added acrossproducts.search,products.details, andcart.checkout.purchase- wait up to 30s for results inline instead of polling.
Cart
cart.createsettings now accept the fullsettings.eventstrigger model, including webhook, email, points, and tier actions with optional conditionals.- Released in
@henrylabs/sdk@1.3.0.
SDK
- Published
@henrylabs/sdk@1.2.1with method signature updates and polling helper refinements.
SDK
- Published
@henrylabs/sdk@1.1.2with refreshed generated types.
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
checkoutUrlalongsidecartId- no separate session step needed. - Unified async pattern (
refId+poll*) across product search, product details, and headless checkout, with a newmode: '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 acardTokenfor 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
falseenum type.
v0.24.0
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
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
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.
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.
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
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
- Added AI Agent to Quickstart Demo. Try it out here.
- This agent is powered by Henry Shopping MCP
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.
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.
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
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
Universal Cart
POST /cart/itemsnow acceptsaffiliateProductLink, letting you pass through your partner tracking links end-to-end.- Added the optional
checkVariantAvailabilityparameter 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