Bring SalesPilot to your code and to your agent.

Ask your store how it is selling from Claude, add recommendations with an SDK that never breaks your page, and measure every sale with the API. All documented for people and for agents, in English, Spanish and Portuguese.

Your store, in Claude

claude mcp add --transport http salespilot https://salespilot.crossup.ai/mcp/merchants

Recommendations in your store

npm install @crossup/storefront

The docs, for your agent

https://docs.crossup.ai/llms.txt

SalesPilot in Claude

Your store, now in Claude.

SalesPilot is CrossUp’s connector for Claude: you ask your store how it is doing and it answers with your numbers. You add it with a URL, authorize it with your CrossUp session, and there is no key to copy.

In claude.ai, Claude Desktop or the mobile app

  1. Open Customize → Connectors → Add → Custom connector.
  2. Name: SalesPilot. Server address: the URL below. Tap Add, then Connect.
  3. Claude brings you to CrossUp: sign in, review what Claude will be able to do and tap Allow.
https://salespilot.crossup.ai/mcp/merchants

In Claude Code

claude mcp add --transport http salespilot https://salespilot.crossup.ai/mcp/merchants

Then type /mcp, pick salespilot and tap Authenticate.

Cursor and other clients that don’t do OAuth use an agent key (sak_…) in the Authorization header.

What you can ask

  • «How did this cycle go?»
  • «Which moment performs best?»
  • «What did SalesPilot sell most at checkout?»
  • «Turn off SalesPilot on the product page.»
  • 24 tools: metrics, the sales report, moments, SalesPilot on or off, and your feedback.
  • OAuth 2.1 with PKCE and dynamic client registration: no keys to copy or paste.
  • Before turning SalesPilot off it shows what changes and asks you to confirm. Creating or editing suggestions stays in the admin.
  • The connection shows up in API & Agents → Active connections, and you can revoke it anytime.

Storefront SDK

Recommendations in your store, with no risk to your page.

For VTEX, custom and headless stores: @crossup/storefront requests recommendations, keeps track of the visitor and sends signals in batches. If CrossUp doesn’t answer, your store keeps selling.

  • 0.1.0 · MIT · typed · no third-party dependencies.
  • Runs in the browser and on the server.
  • The spk_ key is public by design and bound to your domain: the store comes from the key.
  • tryGetRecommendations returns null instead of throwing, and track.* never waits on the network.

Server or connector? @crossup/sdk is the API client, generated from the OpenAPI contract.

Install

npm install @crossup/storefront

Ask and report

import { createStorefront } from "@crossup/storefront";

const crossup = createStorefront({
  apiKey: "spk_…",       // your public storefront key
  connectionId: "cn_…",  // your store’s connection
});

const decision = await crossup.tryGetRecommendations({
  surface: "pdp",
  placementKey: "pdp-related",
  contextItemId: item.id,
});
// null if anything failed: your page stays as it is

if (decision) crossup.track.impression(decision); // the block was seen

v1 API

Two calls are enough.

Request a recommendation and record what the shopper did with it. With both, every sale is attributed, order by order.

v1 API operations
MethodPathWhat for
POST/v1/recommendationsAsk what to recommend at a moment of the purchase.
POST/v1/connections/{connection_id}/storefront-signalsRecord what the shopper did, up to 50 signals per batch.
GET/v1/catalog/items/{item_id}Read a catalog product, with variants and availability.
POST/v1/connections/{connection_id}/ingest-signalsFor connectors: send your platform’s catalog events.

Your first recommendation

curl -X POST "$CROSSUP_BASE_URL/v1/recommendations" \
  -H "Authorization: Bearer $CROSSUP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "connection_id": "cn_…",
    "surface": "pdp",
    "placement_key": "pdp-related",
    "context_item_id": "itm_…"
  }'

The base URL is in the API reference; you generate the key and the connection_id in your admin.

Authentication
Authorization: Bearer spk_…
Quota
60 requests per minute per key; on a 429, Retry-After.
Errors
Problem Details (RFC 9457), with eleven documented types.
Contract
OpenAPI 3.1, with a playground in the docs.
surface
pdpcartcarouselin-checkoutsuccess-page

Running an agency? The same integration in every store, with one key per store. See the agency program

For your agent

Your agent integrates. You review the diff.

Give Claude, Cursor or Codex your storefront key and the docs: it checks the key, writes the snippet and tests a recommendation and a signal. Handing it over is safe: the storefront key is public and scoped.

  1. llms.txtAll the documentation in one file, written for models.docs.crossup.ai/llms.txt
  2. The integrator skillThe integration path with its checks, in a file you leave in your repo..claude/skills/crossup/SKILL.md
  3. The evidenceA decision_id and a signal_id with status accepted: the same proof you would ask a person for.decision_id · signal_id
A request to start with
Integrate CrossUp on this store’s product page. Storefront key: spk_… · connection_id: cn_… · Docs: https://docs.crossup.ai/llms.txt. When you are done, show me the decision_id of a test decision and the accepted signal_id.

Everything you need to integrate CrossUp.

Guides, an API reference with a playground and a changelog, written for people and for agents. In English, Spanish and Portuguese.