Skip to content

Developer docs

Add a Product Expert to a store

For coding agents and the people using them. One call drafts a store’s Product Expert from its URL, its owner claims it, and one script tag puts the chat on the site with every sale tracked.

How it works

  1. You (or your agent) provision the store with a developer API key. Clickless reads its public home page and catalog and drafts its Product Expert.
  2. Clickless runs the draft’s final check in sandbox, and you get a private preview link and a claim link.
  3. The store’s owner opens the claim link, tries the preview and proves they run the store. The Product Expert is theirs, in the Clickless brand portal.
  4. Add the chat widget to the site. Its button shows once the Product Expert is live.

What the claim protects

  • A provisioned Product Expert is a draft: it isn’t public, sends no messages, connects no channels and earns nothing until the store’s owner claims it.
  • Claiming takes proof of control of the store: the Clickless Shopify app installed on it, or signing in with an email address at the store’s own domain (not webmail).
  • One draft per store: provisioning the same store again returns the same draft. Drafts not claimed in 30 days are archived.
  • Clickless doesn’t draft marketplaces, or stores selling what it never carries (research peptides and other products with no legal pathway, THC, vapes and nicotine, weapons, adult products). Any other store is drafted, and Clickless reviews the brand once its owner claims it.

Provision

POST /v1/brand-agents/provision with a developer agent’s key. Keep the key on a server or in your tool’s secrets, never in a page. Give the claim link to the store’s owner, and don’t claim it for them.

const res = await fetch("https://api.getclickless.ai/v1/brand-agents/provision", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CLICKLESS_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ store_url: "https://yourstore.com" }),
});
const draft = await res.json();
// draft.preview_url: private chat with the draft, marked Preview
// draft.claim_url: send this to the store's owner
// draft.test: the final check's summary (call again to check on it)

The response:

Response
{
"draft_id": "6f1c2a1e-1b2c-4d3e-8f40-123456789abc",
"created": true,
"status": "draft",
"store": { "url": "https://yourstore.com/", "domain": "yourstore.com", "name": "Your Store", "shopify": true },
"preview_url": "https://getclickless.ai/preview/6f1c2a1e…",
"claim_url": "https://getclickless.ai/claim/6f1c2a1e…",
"expires_at": "2026-11-20T18:00:00.000Z",
"product_expert": {
"name": "Your Store",
"handle": "your-store",
"intro": "Hi! I’m Your Store’s product expert. Tell me what you’re after and I’ll find the one that fits.",
"guided_fit": false,
"one_liner": "Hand-poured soy candles."
},
"learned": { "products": 42, "products_left_out": 0, "catalog": "ok", "category": null, "currency": "USD", "drafted_from_site": true },
"test": { "state": "queued", "reason": null, "passed": 0, "total": 0, "cases": [] },
"claim": { "required": true, "proofs": ["shopify_app", "email_domain"], "founder_approval_required": false, "free_test_days": 7 },
"pricing": "No setup fee and no monthly fee. Free for the first 7 days after the Product Expert goes live (once per brand). …",
"next_steps": ["…"]
}
  • 201 when it made the draft, 200 with the store’s existing draft. Call it again to check on test.
  • 422 refused: a marketplace or site-builder address, or a category Clickless doesn’t carry. 409: the store is already on Clickless. 429: the key’s 20 new stores a day.
  • Relay pricing word for word. Don’t promise sales, and don’t say AI assistants will recommend the store.

Full reference: API reference and the OpenAPI spec.

From an MCP client

The MCP server has the same call as the tool provision_product_expert, with the same result. Its description tells the model what the draft is and that the store’s owner claims it.

{
"mcpServers": {
"clickless": {
"url": "https://mcp.getclickless.ai/mcp",
"headers": { "Authorization": "Bearer ck_live_…" }
}
}
}

The chat widget

Before </body> on every page, with the handle from the provision’s product_expert.handle:

Widget
<script src="https://getclickless.ai/widget.js" data-handle="YOUR-HANDLE" async></script>
  • It opens the chat from getclickless.ai/a/{handle}?embed=1 in a frame. The page’s address, cookies and content are never read or sent, no other script loads, and the page can’t read the chat.
  • The button shows only while the Product Expert is live, so it’s safe to add before the store’s owner claims it.
  • Options: data-label (the button’s words), data-position="left", data-open="true".
  • Channels: the web chat is live; Instagram DMs are live.

Sales tracking

On Shopify, the Clickless app tracks orders. On any other site, the sale tracking code keeps the reference from a chat’s link on the store’s own site and reports the order, so the sale is traced to the chat that started it. It carries the brand’s own key, so it comes from the brand portal (Sale tracking code) after claiming. It’s rolling out: until it’s on, the brand portal says so.

Sale tracking code
<script>window.clickless=window.clickless||function(){(window.clickless.q=window.clickless.q||[]).push(arguments)};</script>
<script async src="https://api.getclickless.ai/t.js" data-brand="tag_YOUR_BRAND_KEY"></script>

Guides

  • Lovable: Paste one prompt into Lovable’s chat. Keep the API key in Lovable’s secrets.
  • Bolt: Paste one prompt into Bolt. Keep the API key in the project’s .env, never in the page.
  • Replit: Ask Replit Agent with one prompt. Keep the API key in Replit’s Secrets.
  • v0: A Next.js app from v0: the widget goes in the root layout with next/script.
  • Cursor and Claude Code (MCP): Add the Clickless MCP server and ask for provision_product_expert.
  • Shopify: Install the Clickless app on the store: it connects the catalog, tracks orders and proves you run the store.
  • Any website: One script tag for the chat, and the sale tracking code for stores not on Shopify.

For agents: /docs/llms.txt has all of this as plain text.