---
name: zeekend-agent-offers
description: Add Zeekend sponsored product offers to an AI agent or shopping assistant, so it earns on purchases it drives. Triggers on "Zeekend", "zeekend.com", "sponsored offers for my agent", "monetize my AI agent", "add ads to my shopping agent", "earn from my agent's recommendations", "affiliate for AI agents", "agent commerce", "MCP ads".
---

# Add Zeekend offers to an agent

Zeekend gives an agent labeled, sponsored product offers from brands that pay
when a purchase is made. The agent calls it alongside its normal search; the
developer earns a share of each order. Full reference: https://agents-bench.zeekend.com/agents

Follow these steps in order. Do not invent another integration.

## Step 1: Key

Ask the user for their Zeekend agent key. It looks like `agt_live_...`.

**If they do not have one, use `agt_test` and continue.** That is the sandbox:
real offers, nothing billed, nothing credited. They can swap in a live key
later by changing one environment variable. A live key comes from
hello@zeekend.com.

Store the key as the environment variable `ZEEKEND_AGENT_KEY`, server side.
Never put it in browser code, and never invent an `agt_live_` value.

## Step 2: Find where the agent gets its tools or search results

Look for one of:

- **An MCP client configuration** (a list of MCP servers in a config file or in
  code: Claude Agent SDK, OpenAI Agents SDK, Mastra, LangChain MCP adapters).
- **Tool definitions passed to a model** (`tools:` on an Anthropic or OpenAI
  call, `tool()` in the Vercel AI SDK, `@tool` in LangChain).
- **A search step the code runs itself** before calling the model (a web or
  catalog search whose results go into the prompt).

## Step 3: Connect, matching what you found

**MCP client configuration** → add a remote server:

    url:     https://agents-bench.zeekend.com/mcp
    headers: Authorization: Bearer ${ZEEKEND_AGENT_KEY}

No other code is needed; the server tells the model when to call it and how to
label results.

**Tool definitions** → add one tool that calls the REST API. Copy the snippet
for the user's SDK from https://agents-bench.zeekend.com/agents#code without changing the tool
description: it is what tells the model to label results and use the checkout
link. Wire the tool call to:

    POST https://agents-bench.zeekend.com/v1/agent/search
    Authorization: Bearer ${ZEEKEND_AGENT_KEY}
    { "query": "<product words>", "constraints": { "country": "<ISO code>" }, "limit": 3 }

**A search step the code runs itself** → call Zeekend in parallel with it, on
turns that could lead to a purchase, and add the offers to what the model sees
as a separate, labeled "Sponsored offers" section:

    const [results, sponsored] = await Promise.all([search(q), zeekendSearch(q, country)]);

Whichever route: use a timeout of about 1.5 seconds, and on any error or
timeout continue with no sponsored offers. Zeekend must never break the agent.

## Step 4: The shopper's country

Pass `constraints.country` (ISO code) on every call. Use what the app already
knows about the user (profile, locale, IP country on the server). If it knows
nothing, use the country the app mainly serves, and tell the user you did.
If a price limit is passed as a number, pass `constraints.currency` with it.

## Step 5: How the agent shows offers

Make sure the agent's prompt or rendering does all of these. Add a short
instruction to the system prompt if the app has one:

1. Every Zeekend offer is labeled **Sponsored**, next to the offer.
2. The buy link is `cta.url` (same as `checkout_url`), shown as `cta.label`.
   Never link `url`, the plain product page: purchases through it earn nothing.
3. Prices are shown as given (`price_display`, and `compare_at_display` as the
   "was" price when present). Never restate or convert a price yourself.
4. Sponsored offers never replace better organic results; an empty `offers`
   list is normal and needs no mention.

If the app renders products as cards, render Zeekend offers with the same
component plus a visible "Sponsored" label, using `image`, `title`,
`price_display` and a button to `cta.url` labeled `cta.label`.

## Step 6: Verify

See which categories have offers for the user's main country:

    GET https://agents-bench.zeekend.com/v1/agent/categories?country=US
    Authorization: Bearer ${ZEEKEND_AGENT_KEY}

Run the agent (or the tool function directly) with a request for a product in
one of those categories and confirm offers come back. Then confirm the agent's
answer labels them as sponsored and links `cta.url`. If no category is covered
for that country yet, an empty result is correct: say so to the user.

## Step 7: Tell the user

In two or three sentences: what you added and where, that it is on the
sandbox key if so (and how to switch: set `ZEEKEND_AGENT_KEY`), and that they
earn on orders made through the checkout links once on a live key.

## Never

- Never remove or soften the "Sponsored" label, or present offers as the
  agent's own neutral picks.
- Never link the plain product `url` instead of `cta.url`.
- Never call Zeekend from the browser with a live key.
- Never block the agent's answer on Zeekend.
