Cove Wishlist

Cove Wishlist for developers

REST API version 1.0.0. Updated 2026-10-21.

Cove Wishlist works as it is, or you can build on it: read and change wishlists from your own server, or build your own wishlist UI on the storefront. Nothing to install: no SDK, no script tags.

  1. REST API
  2. Authentication
  3. Rate limits and quota
  4. Errors
  5. Endpoints
  6. Storefront HTTP API
  7. Storefront JavaScript API
  8. Events
  9. Pixel events (Meta, GA4)
  10. Klaviyo and Omnisend
  11. Custom elements
  12. Styling hooks
  13. Versioning

REST API

A JSON API for your servers: an ERP, a CRM, a marketing tool or a headless storefront’s backend. It is on the Premium plan.

Authentication

Create a key in the app: Shopify admin › Apps › Cove Wishlist › Developers. Name it after what will use it and pick its access:

The key is shown once, when you create it. We store only a one-way hash, so it can’t be shown again or recovered: if you lose it, revoke it and create another. Revoking takes effect at once. Keys are revoked automatically when the app is uninstalled. A shop can have up to 10 active keys.

Send the key as a bearer token:

curl https://covewishlist.com/api/v1/me \
  -H "Authorization: Bearer $COVE_API_KEY"

Server to server only. A key reads and changes every customer’s wishlist in your shop, so keep it on a server, in an environment variable or secret store. Never put it in theme code, a mobile app or anything a browser downloads. The API sends no CORS headers, so browsers can’t call it.

Keys work while the shop’s plan includes the developer API. After a downgrade, calls answer 403 plan_required until you upgrade again; the keys themselves are kept.

Rate limits and quota

Errors

Errors are JSON, { "error": "code" }, with the HTTP status below. Match on the code, not the message.

StatusCodeMeaning
400invalid_requestThe body or query failed validation (unknown fields included).
400invalid_jsonThe body isn’t JSON.
400invalid_customer_idThe customer ID isn’t a numeric Shopify customer ID.
400invalid_product_idThe product ID isn’t a numeric Shopify product ID.
400invalid_limit`limit` is not an integer from 1 to 250.
401missing_api_keyNo `Authorization` header.
401invalid_api_keyThe key is malformed, unknown or revoked, or the app is uninstalled.
403plan_requiredThe shop’s plan doesn’t include the developer API. Also carries `feature` and `plan`.
403insufficient_scopeA write with a read-only key.
404list_not_foundThe `listId` isn’t one of this customer’s lists.
404not_foundNo such endpoint.
405method_not_allowedWrong HTTP method; `Allow` names the right one.
409list_fullThe list already holds 500 items.
413body_too_largeThe body is over 16 KB.
429rate_limitedToo many requests; wait `Retry-After` seconds.
429quota_reachedThe shop has used its monthly wishlist actions; adds are refused until the next month or an upgrade.
500internal_errorOur fault. Safe to retry: every operation is idempotent.
503pausedThe app’s storefront features are paused on this shop.

Endpoints

GET/me

The shop and scope of the key. Use it to check credentials.

{ "shop": "your-store.myshopify.com", "scope": "READ_WRITE" }

GET/customers/{customerId}/wishlist

Every list of the customer with its saved items, newest first. A customer who never saved anything gets "lists": [], not a 404. List names are shopper text: show them as text, never as HTML. Share links and shoppers’ private notes are never returned; shared says whether a list has a live link.

curl https://covewishlist.com/api/v1/customers/7012345678901/wishlist \
  -H "Authorization: Bearer $COVE_API_KEY"
{
  "customerId": "7012345678901",
  "count": 2,
  "lists": [
    {
      "id": "clx0examplelistid0000",
      "name": "My wishlist",
      "isDefault": true,
      "shared": false,
      "createdAt": "2026-10-01T09:30:00.000Z",
      "count": 2,
      "items": [
        { "productId": "8123456789", "variantId": "45123456789", "quantity": 1, "addedAt": "2026-10-20T18:02:11.000Z" },
        { "productId": "8123456790", "variantId": null, "quantity": 1, "addedAt": "2026-10-02T10:00:00.000Z" }
      ]
    }
  ]
}

POST/customers/{customerId}/items

Save a product, or one variant of it, for a customer (read and write key). Without listId it goes to the customer’s default list, created on first use; with it, to that list, which must be one of theirs. Answers 201 with "added": true, or 200 with "added": false when it was already there, plus the new wishlist. A list holds up to 500 items.

curl -X POST https://covewishlist.com/api/v1/customers/7012345678901/items \
  -H "Authorization: Bearer $COVE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "productId": "8123456789", "variantId": "45123456789" }'

DELETE/customers/{customerId}/items/{productId}

Remove a saved product (read and write key). Query parameters: variantId removes that variant’s save instead of the product-level one; listId removes it from that list only, otherwise it leaves every list. Answers { "removed": n, "wishlist": … }; removed is 0 when nothing was saved.

curl -X DELETE "https://covewishlist.com/api/v1/customers/7012345678901/items/8123456789?variantId=45123456789" \
  -H "Authorization: Bearer $COVE_API_KEY"

GET/products/most-saved

The shop’s products by how many shoppers have them saved now (a shopper counts once however many lists hold it), with saves, the saved rows. limit is 1 to 250, default 50. Counts only: never who saved.

{ "products": [{ "productId": "8123456789", "shoppers": 42, "saves": 47 }] }

Storefront HTTP API

The JSON endpoints the storefront hearts use, for custom wishlist UIs in an Online Store theme. They live under your store’s own domain at /apps/wishlist (Shopify’s app proxy), so they only work from your storefront: Shopify signs each request and passes the signed-in customer, if any. There is no key and nothing to configure. A headless storefront on another domain should call the REST API from its server instead.

POST /apps/wishlist…BodyReturns
/state
The shopper’s saved items, lists and count. Creates nothing; merges a guest list into the customer after sign-in.
{ guestToken? }state
/items
Save, unsave or move one product or variant. Without listId, add goes to the default list and remove unsaves from every list. An add with listId makes that list the default.
{ action: "add" | "remove", productId, variantId?, listId?, guestToken? } or { action: "move", productId, variantId?, listId, toListId, guestToken? }state (+ guestToken on a guest’s first save)
/lists
Manage named lists and their share links. Creating needs the multiple-lists plan, share and replace the sharing plan.
{ action: "create", name } or { action: "rename", listId, name } or { action: "delete" | "default" | "share" | "pause" | "replace" | "revoke", listId }, plus guestToken?state + listId
/merge
Signed-in customers only: move this browser’s guest list into the account now.
{ guestToken }state + mergedItems
/note
Set (or clear with "") the shopper’s own note on a saved item, up to 500 characters.
{ productId, variantId?, note, guestToken? }{ note }
/resolve
Product IDs and saved state for product handles (for cards that only know a handle). Unknown handles are left out.
{ handles: string[] (1-50), guestToken? }{ products: { [handle]: { productId, saved } } }
/view
Trade a guest token for a short-lived ticket to open the wishlist page as /apps/wishlist?view=<ticket>, so the token never appears in a URL.
{ guestToken? }{ signedIn, ticket }
/cart
Count items added to cart from a wishlist (analytics only).
{ items: 1-50, guestToken? }{ ok: true }

The state most endpoints return (count is distinct saved products and variants; an item in two lists counts once):

{
  "signedIn": false,
  "count": 1,
  "items": [
    { "productId": "8123456789", "variantId": null, "listIds": ["clx0examplelistid0000"] }
  ],
  "lists": [{ "id": "clx0examplelistid0000", "name": "My wishlist", "isDefault": true }],
  "features": { "multipleLists": false, "sharing": true },
  "guestToken": "<only on a guest's first save>"
}
const res = await fetch('/apps/wishlist/items', {
  method: 'POST',
  credentials: 'same-origin',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    action: 'add',
    productId: '8123456789',
    guestToken: localStorage.getItem('cove:guest') || undefined,
  }),
});
const state = await res.json();
if (state.guestToken) localStorage.setItem('cove:guest', state.guestToken);

Two pages are served there too, as Liquid inside your theme: GET /apps/wishlist (the shopper’s wishlist) and GET /apps/wishlist/s/{token} (a shared list).

Storefront JavaScript API

On every storefront page with the Cove Wishlist app embed on, window.CoveWishlist works the hearts’ wishlist from your own theme code: the same calls, the same shopper (signed in or guest), and every heart and counter on the page updates with it. Nothing to install. The script loads deferred, so code that may run first can wait for the cove:ready event on document.

MethodResolves withDoes
get()Item[]The saved items: { productId, variantId, listIds }.
count()numberSaved products and variants (an item in two lists counts once).
has(productId, variantId?)booleanWhether it is saved. Without a variant: the product is saved at all, in any variant. With one: that variant, or the product saved without a variant (which covers all of them).
add(productId, variantId?)Item[]Save it to the shopper’s default list. Resolves with the new items.
remove(productId, variantId?)Item[]Unsave it from every list, with every save that makes has() true for it: without a variant, the product in any variant; with one, that variant and a product-level save.
toggle(productId, variantId?)Item[]Add it if it isn’t saved, remove it if it is.

Events

cove:change fires on document after every save, removal and sync, from the hearts, the API or another component. event.detail is { items, count, action, productId }: action is add, remove or sync (the first load, a guest list merged at sign-in, a move between lists or a list change), and productId is the product saved or removed (null on a sync). On an add or removal it may also carry variantId, listId (absent for a one-tap save, which goes to the default list, or a removal from every list) and source. cove:ready fires once, when the script has set up.

document.addEventListener('cove:change', event => {
  const { count, action, productId } = event.detail;
  document.querySelector('#my-count').textContent = String(count);
});

const button = document.querySelector('#my-heart');
button.addEventListener('click', async () => {
  try {
    await window.CoveWishlist.toggle(button.dataset.productId);
  } catch (error) {
    if (error.code === 'sign_in_required') location.href = '/account/login';
  }
});

Pixel events (Meta, GA4)

On the Pro plan and up, Cove publishes wishlist actions as Shopify custom customer events. Any pixel on your store can subscribe to them: a custom pixel you add in Settings › Customer events, or an app pixel that listens for them. Shopify’s Facebook & Instagram and Google & YouTube apps send Shopify’s standard events only, so they don’t forward these on their own: the custom pixel below does. Like every pixel, they follow your store’s customer privacy settings.

EventWhenevent.customData
cove_item_addedA shopper saved a product or variant.
productId: Shopify product ID (string)
variantId: Shopify variant ID, or null when the product was saved
listId: Cove’s opaque ID of the list, or null (a removal from every list)
source: where it happened (see below)
cove_item_removedA shopper removed one.
productId: Shopify product ID (string)
variantId: Shopify variant ID, or null when the product was saved
listId: Cove’s opaque ID of the list, or null (a removal from every list)
source: where it happened (see below)
cove_list_sharedA shopper copied their share link, sent it from the share sheet or opened the email link.
listId: Cove’s opaque ID of the shared list
method: copy, native or email
cove_notify_subscribedA shopper’s back-in-stock email alert went live. A guest who still has to confirm it by email isn’t counted.
productId: Shopify product ID
variantId: the sold-out variant (never the email address)

source is one of:

No event carries an email address, a customer ID, a guest token or a share link. Cove installs no pixel of its own: that would need permission to write your store’s pixel settings, and Cove asks for no write access to your store’s data.

Send wishlist saves to Meta and Google Analytics 4

  1. In your Shopify admin, go to Settings › Customer events and click Add custom pixel. Name it “Cove Wishlist”.
  2. Under Customer privacy, require Marketing and Analytics permission, as you would for any ads pixel.
  3. Paste the code below, replace the Meta Pixel ID and GA4 measurement ID, then Save and Connect.
  4. Save a product on your store, then check with the Meta Pixel Helper (AddToWishlist), GA4 DebugView (add_to_wishlist) or Shopify’s Test button on the pixel.
// Cove Wishlist → Meta Pixel and Google Analytics 4.
// Settings › Customer events › Add custom pixel. Paste this, replace the
// two IDs, and delete the half you don't use.
const META_PIXEL_ID = 'YOUR_META_PIXEL_ID';
const GA4_MEASUREMENT_ID = 'G-XXXXXXXXXX';

// Your catalog's ID for a saved item, so the event matches your ads catalog.
// Catalogs synced by Shopify's Facebook & Instagram and Google & YouTube
// apps usually use shopify_<COUNTRY>_<product ID>_<variant ID>: set your
// catalog's country, or return variantId if your catalog uses variant IDs.
const CATALOG_COUNTRY = 'US';
function catalogId(productId, variantId) {
  return variantId
    ? 'shopify_' + CATALOG_COUNTRY + '_' + productId + '_' + variantId
    : productId;
}

function loadScript(src) {
  const script = document.createElement('script');
  script.async = true;
  script.src = src;
  document.head.appendChild(script);
}

// Meta Pixel (Meta's base code, written out).
const fbq = (window.fbq = function () {
  fbq.callMethod ? fbq.callMethod.apply(fbq, arguments) : fbq.queue.push(arguments);
});
fbq.push = fbq;
fbq.loaded = true;
fbq.version = '2.0';
fbq.queue = [];
loadScript('https://connect.facebook.net/en_US/fbevents.js');
fbq('init', META_PIXEL_ID);

// Google tag. No page view: your Google channel already sends those.
window.dataLayer = window.dataLayer || [];
function gtag() {
  window.dataLayer.push(arguments);
}
loadScript('https://www.googletagmanager.com/gtag/js?id=' + GA4_MEASUREMENT_ID);
gtag('js', new Date());
gtag('config', GA4_MEASUREMENT_ID, { send_page_view: false });

analytics.subscribe('cove_item_added', (event) => {
  const { productId, variantId } = event.customData;
  const id = catalogId(productId, variantId);
  fbq('track', 'AddToWishlist', {
    content_ids: [id],
    content_type: 'product',
  });
  gtag('event', 'add_to_wishlist', {
    items: [{ item_id: id }],
  });
});

The same analytics.subscribe pattern works for the other events, for any service your pixel can reach.

Klaviyo and Omnisend

On the Pro plan and up, Cove can also hand wishlist saves, removals and back-in-stock signups to the Klaviyo or Omnisend script already on your store, so you can build flows on them. Turn each one on in the theme editor: App embeds › Cove Wishlist › Advanced › Send wishlist events to Klaviyo or Send wishlist events to Omnisend. Both are off until you do.

WhenKlaviyo metricOmnisend custom event
A shopper saved a product or variant.Added to Wishlistadded product to wishlist
A shopper removed one.Removed from Wishlistremoved product from wishlist
A shopper asked Cove for a back-in-stock email (the address stays with Cove).Signed Up for Back in Stocksigned up for back in stock
Klaviyo propertyOmnisend properties.productHolds
ProductIDidShopify product ID (string)
VariantIDvariantIdShopify variant ID, or null
ProductNametitlethe product title
URLurlthe product page URL
ImageURLimageUrlthe variant’s image, else the product’s
Pricepricethe variant’s price: in units for Klaviyo (22.5), in cents for Omnisend (2250)
Currencycurrencythe shopper’s currency (ISO code)
Sourceproperties.sourcewhere it happened, as for pixel events; notify for a signup

Attentive isn’t supported: its onsite Tag SDK has no custom events, and its custom events API needs a private API key, which Cove doesn’t hold. Use Shopify Flow (below) instead.

Build a wishlist reminder flow in Klaviyo

  1. Turn on Send wishlist events to Klaviyo and save a product on your store in a browser Klaviyo knows (for example after clicking one of your Klaviyo emails). Within a few minutes the profile’s activity feed shows Added to Wishlist.
  2. In Klaviyo, create a flow from scratch and choose the metric Added to Wishlist as its trigger.
  3. Add a flow filter such as “Placed Order zero times since starting this flow”, then a time delay (two or three days works for most stores).
  4. Add an email. Use {{ event.ProductName }}, {{ event.ImageURL }}, {{ event.URL }} and {{ event.Price }}. For saves from a product card, which carry no price, look the product up in your synced catalog with Klaviyo’s catalog lookup tag on event.ProductID.

In Omnisend, the same works as an automation whose trigger is the custom event added product to wishlist; its properties are available to the email.

Back in stock, and the Shopify Flow alternative

A browser event can’t tell Klaviyo that a product came back in stock: Cove knows that on its server, from your inventory. On the Starter plan and up, Cove’s Shopify Flow triggers (Wishlisted item back in stock, price dropped, running low, item added) fire for signed-in customers, and Klaviyo’s Shopify Flow connector can turn one into a Klaviyo event:

  1. In Shopify Flow, start a workflow with the Cove Wishlist trigger Wishlisted item back in stock.
  2. Add Klaviyo’s Track an event action. Name the event (for example “Wishlist Item Back in Stock”), map the customer’s email and the product’s title, URL and image from the trigger. The Klaviyo public API key that action asks for is entered in Shopify Flow, not in Cove.
  3. In Klaviyo, build a flow on that metric and send the email.

This works for any platform with a Shopify Flow action, and it reaches customers who saved while signed in, wherever they browse later. Cove can also send the back-in-stock email itself (Signed Up for Back in Stock then tells Klaviyo who asked).

Custom elements

For page builders and sections where the app’s blocks can’t go. Turn them on in the theme editor: App embeds › Cove Wishlist › Advanced › Load custom elements. Stores that leave it off load nothing extra.

<cove-button product-id="8123456789"></cove-button>
<cove-button product-id="8123456789" variant-id="45123456789" button-style="icon"></cove-button>
<cove-count></cove-count>
<cove-link></cove-link>
<cove-link>My wishlist</cove-link>

The elements render text with textContent only and never fetch anything of their own.

Styling hooks

Restyle Cove from your theme’s CSS with these custom properties and classes. They are stable within version 1: we may add new ones, but renaming or removing one only happens in a new major version, announced here. Anything else about the markup (element order, wrappers, attributes not listed) can change in any release, so target the hooks, not the structure. Pro stores can also add custom CSS in the Design Studio.

Custom properties

Set by the app embed on :root from the Design Studio (the wishlist grid ones on .cove-wl). Override them in your theme to change one value everywhere.

PropertyWhat it is
--cove-colorIcon colour.
--cove-color-activeIcon colour when saved, and the count badge.
--cove-color-hoverIcon colour on hover (falls back to --cove-color).
--cove-bgBackground of card hearts and the floating wishlist link.
--cove-borderBorder of the pill button, hearts and floating link.
--cove-sizeIcon size.
--cove-size-mobileIcon size below 750px.
--cove-radiusCorner radius of card hearts.
--cove-card-offsetDistance of a card heart from the card’s corner.
--cove-font-scaleText size multiplier for the button, toast and social proof.
--cove-fontFont family, only when the design picks one.
--cove-heading-fontHeading font on the wishlist page, only when picked.
--cove-labelButton label colour, only when set.
--cove-button-fillButton background, only when set.
--cove-letter-spacingLetter spacing of button, toast and social proof text.
--cove-toast-bgToast background.
--cove-toast-textToast text colour.
--cove-wl-colsWishlist page grid columns (set on .cove-wl).
--cove-wl-cols-mobileWishlist page grid columns below 750px.

Buttons and hearts

ClassWhat it is
cove-productWrapper of the product page button block.
cove-product--fullFull-width product button.
cove-btnEvery wishlist button, including <cove-button>.
cove-btn--outlineOutlined button style.
cove-btn--pillPill button style.
cove-btn__labelThe button’s text.
cove-iconThe heart (or custom) icon, an inline SVG.
cove-proofSocial proof line under the product button.
cove-notify“Notify me when available” box under the product button (ACCB-394).
cove-notify__buttonThe “Notify me” button.
cove-notify__formThe guest form (email + consent).
cove-notify__fieldThe email field’s label, around its text and the field.
cove-notify__emailThe guest form’s email field.
cove-notify__consentThe consent tick and its text.
cove-notify__submitThe guest form’s submit button.
cove-notify__noteConfirmation or error text.
cove-cart-save“Save for later” button on a cart line, cart page and drawer (ACCB-385).
cove-cardAdded to a theme product card that carries a heart.
cove-heartHeart on a product card.
cove-heart--top-rightHeart position: top right.
cove-heart--top-leftHeart position: top left.
cove-heart--bottom-rightHeart position: bottom right.
cove-heart--bottom-leftHeart position: bottom left.
cove-heart--overlayHeart over a wishlist page card’s image.

Wishlist link and count

ClassWhat it is
cove-launcherLink to the wishlist page, including <cove-link>.
cove-launcher--floatingThe floating round link.
cove-launcher--headerThe link placed in the header.
cove-launcher--elementA <cove-link>.
cove-launcher--textA <cove-link> with its own content.
cove-countSaved-item count; hidden at 0.
cove-vhText for screen readers only (the wishlist link’s name, the compare-at price’s label).
cove-count--inlineThe count inside <cove-count>, in line.

Toast and list picker

ClassWhat it is
cove-toastThe confirmation toast.
cove-toast__linkLinks and buttons in the toast.
cove-sheetThe “Change” list picker overlay.
cove-sheet__panelIts panel.
cove-sheet__titleIts title.
cove-sheet__listsThe list of lists.
cove-sheet__itemOne list, with its tick box.
cove-sheet__newThe new-list form.
cove-sheet__createIts create button.
cove-sheet__closeThe close button.

Wishlist page

ClassWhat it is
cove-wlThe page (owner, guest or shared).
cove-wl__headTitle row, with “Add all to cart”.
cove-wl__titlePage title.
cove-wl__introIntro text.
cove-wl__toolsRow above the grid: list tabs, share and manage lists.
cove-wl__actionsShare and manage lists chips.
cove-wl__notice“Link paused” notice.
cove-wl__addall“Add all to cart” form.
cove-wl__signinSign-in prompt for guests.
cove-wl__flagged“Needs attention” notice.
cove-wl__gridThe product grid.
cove-wl__pagesPagination.
cove-wl__loadingLoading state of the guest page.
cove-wl__emptyEmpty state.
cove-wl__empty-titleEmpty state title.
cove-wl__empty-badgeCircle around the empty state illustration.
cove-wl__empty-imgEmpty state image.
cove-wl__empty-iconEmpty state illustration, when no image is set.
cove-wl__ctaEmpty state button.
cove-wl-cardOne saved product.
cove-wl-card__mediaIts image (data-ratio: square, portrait or natural).
cove-wl-card__placeholderImage placeholder.
cove-wl-card__badgesBadges over the image.
cove-wl-badgeA badge.
cove-wl-badge--drop“Price dropped” badge.
cove-wl-removeRemove button over the image.
cove-wl-card__bodyVendor, title, variant and price.
cove-wl-card__headingThe card’s heading (h2), around the product title.
cove-wl-card__titleProduct title.
cove-wl-card__vendorVendor.
cove-wl-card__choiceVariant slot: the saved variant or the variant chooser.
cove-wl-card__variantVariant.
cove-wl-card__pricePrice.
cove-wl-card__cartAdd-to-cart form.
cove-wl-card__addAdd-to-cart button.
cove-wl-card__optionsVariant buttons (one option with up to six values).
cove-wl-card__optionOne variant button.
cove-wl-card__select-wrapAround a select.
cove-wl-card__selectVariant or list select.
cove-wl-card__labelForm labels.
cove-wl-card__actionsCard footer: note and “Move to”.
cove-wl-card__noteThe note’s first line.
cove-wl-noteThe note dialog.
cove-wl-note__formIts form.
cove-wl-move“Move to” form.
cove-wl-linkText-style buttons (note, move, list and share actions).
cove-wl-link--dangerDelete list, stop sharing.
cove-wl-listsList tabs.
cove-wl-manageManage lists chip and dialog.
cove-wl-chipSmall bordered controls (share, manage lists).
cove-wl-icoLine icons in chips and buttons.
cove-wl-shareShare controls.
cove-wl-share__openOpens the share dialog.
cove-wl-share__liveDot on it while the link is live.
cove-wl-share__hintWho can see the link.
cove-wl-share__fieldLink field and Copy.
cove-wl-share__rowEmail and share buttons.
cove-wl-share__morePause, replace, stop.
cove-wl-dialogShare, manage lists, “Move to” and note dialogs.
cove-wl-dialog__panelIts panel.
cove-wl-dialog__headTitle and close button.
cove-wl-dialog__titleIts title.
cove-wl-dialog__xIts close button.
cove-wl-dialog__choicesThe lists to move to.
cove-wl-dialog__itemOne list to move to.
cove-wl-dialog__countIts item count.
cove-wl-dialog__actionsIts buttons.
cove-wl-dialog__footSecondary actions under a rule.
cove-wl-dialog__textWhat a confirm dialog’s action will do.
cove-wl-confirmA confirm dialog (delete a list, new link, stop sharing).
cove-wl-btnButtons inside dialogs.
cove-wl-btn--primaryThe main one.
cove-wl-btn--dangerA confirm dialog’s action that can’t be undone.
cove-wl-fieldA dialog field with its button.
cove-wl-field__labelIts label.
cove-wl-actOne list or share action form.

States

ClassWhat it is
is-savedOn a button or heart whose item is saved.
is-busyWhile a save or removal is in flight.
is-toggledOn the button the shopper pressed (save animations key on it).
is-visibleOn the toast while it shows.
is-readyOn the guest wishlist page once loaded.
is-unavailableOn a wishlist card whose product can’t be bought.

Versioning

The REST API is versioned in its path (/api/v1) and follows semantic versioning: within v1 we only add (new endpoints, new optional fields, new error codes), so ignore fields you don’t know. Anything that would break an integration ships as /api/v2, announced here with time to move. The storefront endpoints, window.CoveWishlist, its events, the custom elements and the styling hooks follow the same rule (version 1).

Questions or a feature you need: contact@stackcraftdigital.co.uk. Security reports: see our security page.