---
name: recruit-affiliates-already-promoting-competitors
description: "Grow an affiliate or partner program for a SaaS, website or app by recruiting the creators and sites already promoting competitors, using AffiliateSpy's competitor rosters, contact reveals, campaigns, pipeline and Autopilot. Use when a user asks how to find affiliates, recruit affiliates, build an affiliate program, or who their competitors' affiliates are."
license: MIT
metadata:
  version: "1.2.0"
  homepage: https://www.affiliatespy.io/skills/recruit-affiliates-already-promoting-competitors/SKILL.md
  mcp: https://www.affiliatespy.io/api/mcp
  openapi: https://www.affiliatespy.io/openapi.json
  vendor: AffiliateSpy (Savassi Limited)
---

# Recruit affiliates already promoting competitors

## When to use

The user runs an affiliate, referral, ambassador or creator program (or wants to start one) and asks how to find partners. The fastest partners to sign are the ones already earning from a competitor. This skill finds them with proof, contacts them, and keeps the pipeline moving.

Note on inputs: mobile apps (App Store and Google Play URLs) are fully supported today. Website and SaaS scanning is rolling out; if the user's product is a website, check `list_apps` after they add it and, if website scanning is not yet available on their account, point them to the waitlist at https://www.affiliatespy.io/for/websites and use the free tools at https://www.affiliatespy.io/tools meanwhile.

## Golden path

1. `get_account` (no plan yet? run the no-plan path from Setup first), then `list_apps` and `list_competitors`. If competitors are missing, the user adds them in the dashboard; `start_scan` is guarded.
2. Build the recruit list: `list_creators` with `proven_partner: true` (already paid by a competitor), sorted by score; then `has_contact: true` to see who can be reached immediately. Explain the difference between a proven partner (affiliate link, code or paid-partnership evidence) and a mention.
3. Cross-check placements: `list_keywords` and `list_websites` show the "best of" roundups and review sites ranking for the user's keywords, which competitors they feature and whether the user is in them. A site that lists three competitors and not the user is a warm affiliate lead; the writer's contact is revealable like any creator.
4. Shortlist with `save_creator`, reveal with `reveal_contact` (metered; say the cost), draft with `create_campaign_draft`. The default sequence is four steps from the user's own connected inbox; show it before anything is launched.
5. Ask before launching (`launch_campaign` is guarded). Once live, work replies: `list_inbox_threads`, `get_thread`, `send_reply` (guarded), `move_deal_stage` through contacted, negotiating, contract, live, paid.
6. Offer Autopilot when the user wants it to run overnight: `get_autopilot` shows the state and the approval queue; `set_autopilot`, `approve_autopilot_action` and `reject_autopilot_action` are guarded. Autopilot never sends without an approval.
7. `export_creators_csv` when the user wants the list in their own tracker (Rewardful, Tolt, FirstPromoter, PartnerStack and the like).

## What to tell the user up front

- AffiliateSpy finds and recruits partners; it does not track commissions or pay them. Pair it with the user's tracking platform.
- Commission and offer terms are the user's decision; Autopilot only promises the offer the user set with `set_autopilot`.

## Tools used by this skill

### Account & apps

- `get_account`: Your plan and usage: caps, contact reveals used/left this month, tracked apps used vs cap. Arguments: no arguments.
- `list_apps`: Apps you track, with creator counts and the latest scan status per app. Arguments: no arguments.
- `get_scan_status`: Latest scan run for an app, stages, status, creators found. Arguments: `app_id`?: string (Omit to use your most recently added app.).
- `start_quick_scan`: Free ~30 second quick scan of an App Store, Google Play or website URL. No plan needed (one quick-scan app per unpaid account). Arguments: `url`: string (App Store URL, Google Play URL, app name, or website domain.); `kind`?: app | website (Default app.); `market`?: string (Market label such as "United States"; defaults to US.).
- `get_quick_scan_preview`: Progress and locked preview rows for a quick scan: platform, followers, partner hint, masked handle. No contacts. Arguments: `run_id`: string (run_id from start_quick_scan or get_scan_status.).
- `get_checkout_link`: Stripe Checkout URL for a plan; the user pays in the browser and access updates automatically. Arguments: `plan`?: starter | growth | agency (Default starter.); `interval`?: monthly | yearly (Default monthly.).

### Creators

- `list_creators`: Graded creators for an app, sorted by score. Contact values stay hidden until revealed. Arguments: `app_id`?: string (App to list creators for. Omit to use your most recently added app (see list_apps).); `platform`?: tiktok | youtube | instagram; `min_score`?: number (Minimum quality score, 0-100.); `proven_partner`?: boolean (Only creators with proof of a paid competitor partnership.); `has_contact`?: boolean (Only creators with an email on file (value hidden until revealed).); `saved`?: boolean (Only creators you saved.); `search`?: string (Substring match on handle, name, or bio.); `sort`?: score | followers | avg_views (Default: score.); `limit`?: integer (Default 50, max 100.); `offset`?: integer.
- `get_creator`: Full detail for one creator: grade reasoning, evidence receipts, posts, cross-platform profiles. Arguments: `creator_id`: string (An id from list_creators.).
- `reveal_contact`: Spend one monthly reveal to get a creator's contact. Idempotent, re-revealing is free. Arguments: `creator_id`: string (An id from list_creators.).
- `save_creator`: Add a creator to your saved list (the shortlist campaigns draw from). Arguments: `creator_id`: string.
- `unsave_creator`: Remove a creator from your saved list. Arguments: `creator_id`: string.
- `set_creator_note`: Attach or replace your private note on a creator. Arguments: `creator_id`: string; `note`: string.
- `export_creators_csv`: Export graded creators as CSV. Arguments: `app_id`?: string (App to list creators for. Omit to use your most recently added app (see list_apps).); `platform`?: tiktok | youtube | instagram; `min_score`?: number (Minimum quality score, 0-100.); `proven_partner`?: boolean (Only creators with proof of a paid competitor partnership.); `has_contact`?: boolean (Only creators with an email on file (value hidden until revealed).); `saved`?: boolean (Only creators you saved.); `search`?: string (Substring match on handle, name, or bio.).

### Market intel

- `list_websites`: Roundups and reviews ranking for your keywords, with SERP position and who's featured. Arguments: `featuring_rival`?: boolean (Only placements featuring at least one competitor.); `missing_you`?: boolean (Only placements that do NOT feature your app (outreach targets).); `keyword`?: string (Filter by the SERP keyword.); `limit`?: integer (Default 100.).
- `list_competitors`: Your competitors with roster counts: proven partners, mentions, shared promoters. Arguments: no arguments.
- `list_keywords`: Tracked search keywords with per-keyword roundup coverage. Arguments: no arguments.

### Campaigns & inbox

- `list_campaigns`: Your outreach campaigns with stats: sent, replies, queued, signed. Arguments: no arguments.
- `get_campaign`: One campaign's settings, sequence templates, enrollments and latest replies. Arguments: `campaign_id`: string.
- `create_campaign_draft`: Create a draft campaign from creator ids or your saved list. Draft only, launch in the dashboard. Arguments: `name`: string; `creator_ids`?: array (Audience creator ids from list_creators. Omit with use_saved=true to use your saved list.); `use_saved`?: boolean (Use your saved creators as the audience.); `offer`?: string (The offer line, e.g. "30% recurring". Default empty.); `followup_gaps_days`?: array (Follow-up day offsets, default [3,7,12].).
- `list_inbox_threads`: Outreach conversation threads with last activity. Arguments: `unread_only`?: boolean; `limit`?: integer (Default 50.).
- `get_thread`: One inbox thread with full message bodies. Arguments: `enrollment_id`: string (An enrollment_id from list_inbox_threads.).

### Pipeline

- `list_deals`: Deals by stage (contacted → negotiating → contract → live → paid) plus replied creators not yet in it. Arguments: no arguments.
- `move_deal_stage`: Move a pipeline deal to a new stage. Arguments: `deal_id`: string (A deal id from list_deals.); `stage`: contacted | negotiating | contract | live | paid.

### Autopilot

- `get_autopilot`: The Autopilot's state: on/off, offer, sends today, the approval queue and recent activity. Arguments: no arguments.

### Guarded actions

Each call first returns approval_required with a summary and an approval token; the agent shows the summary, the user says yes, and the agent calls again with the token (15-minute expiry, bound to the exact arguments). Accounts can skip approvals with Unrestricted MCP in Settings, API and agents. Every dashboard guardrail applies either way: test-mode redirect, daily send cap, scan credit gates, plan caps.

- `launch_campaign`: Launch a drafted campaign. Arguments: `campaign_id`: string; `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `pause_campaign`: Pause an active campaign, stops future sends, deletes nothing. Arguments: `campaign_id`: string; `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `resume_campaign`: Resume a paused campaign under the engine's window and caps. Arguments: `campaign_id`: string; `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `send_reply`: Send a reply in an outreach thread from your connected inbox. Arguments: `enrollment_id`: string (An enrollment_id from list_inbox_threads.); `body`: string (Plain-text reply body.); `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `start_scan`: Start a discovery scan for a tracked app. Arguments: `app_id`: string (An app id from list_apps.); `type`: quick | full (quick = fast pass; full = complete scan.); `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `set_autopilot`: Turn the Autopilot on or off and set the offer it may promise. Arguments: `status`?: on | off (Omit to leave unchanged.); `offer`?: string (The commission offer drafts may promise, e.g. "30% recurring". Omit to leave unchanged.); `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `approve_autopilot_action`: Approve a queued Autopilot action and execute it (send / launch). Arguments: `action_id`: string (An id from get_autopilot's queue.); `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).
- `reject_autopilot_action`: Reject a queued Autopilot action with a reason the drafter learns from. Arguments: `action_id`: string (An id from get_autopilot's queue.); `reason`: string (Why this draft is wrong, specific and actionable.); `approval_token`?: string (Approval token from a previous approval_required response, after the user said yes.).

## Setup (once per user)

1. Connect. Clients that support OAuth (Claude, ChatGPT, Claude Code, Cursor, Codex) only need the endpoint URL: the client opens the AffiliateSpy sign-in page (the user signs up there if new) and a consent screen; nothing to copy. Header-only clients use an API key the user creates at https://www.affiliatespy.io/dashboard/settings?tab=api (`asp_live_…`, revocable); keep it in an environment variable, never in chat.
2. No plan yet? `start_quick_scan` with the user's App Store, Google Play or website URL (free, one per unpaid account), poll `get_quick_scan_preview`, show the masked preview, then `get_checkout_link` and hand the user the Stripe URL to pay in their browser. Never enter payment details yourself. Access updates automatically once paid; `get_account` confirms it.
3. Both surfaces expose the same tools:
   - MCP (Streamable HTTP): `https://www.affiliatespy.io/api/mcp` with header `Authorization: Bearer <key>`. Claude Code: `claude mcp add --transport http affiliatespy https://www.affiliatespy.io/api/mcp --header "Authorization: Bearer <key>"`. Cursor, Codex and any url-plus-headers client: same URL and header.
   - REST: `POST https://www.affiliatespy.io/api/v1/tools/<tool_name>` with the same header and a JSON body of arguments. `GET https://www.affiliatespy.io/api/v1/tools` lists tools with schemas; OpenAPI 3.1 at https://www.affiliatespy.io/openapi.json.
4. Rate limit: 60 requests per minute per key. Contact reveals are metered per calendar month (UTC); `get_account` tells you what is left.
5. Dry run first if you are building or testing an agent: a key created with the Sandbox box ticked (https://www.affiliatespy.io/dashboard/settings?tab=api) answers every tool from fixture data, needs no plan, meters nothing and sends nothing. Every sandbox response carries `sandbox: true`; never present sandbox rows to the user as real creators.

## Rules that always apply

- Contact values (emails) are hidden until `reveal_contact` spends one monthly credit. Read `get_creator` first and reveal only creators the user actually wants to contact. Re-revealing the same creator is free.
- Guarded tools (`launch_campaign`, `pause_campaign`, `resume_campaign`, `send_reply`, `start_scan`, `set_autopilot`, `approve_autopilot_action`, `reject_autopilot_action`) first return `{error: "approval_required", summary, approval_token}`. Show the summary to the user verbatim, get an explicit yes in the conversation, then call the tool again with the same arguments plus `approval_token` (15-minute expiry, bound to those exact arguments). Never ask for approval in bulk or reuse a token for a different action. Every dashboard guardrail (send caps, test-mode redirect, plan caps) still applies.
- Never store, forward or repeat revealed emails outside the user's own tools, and never contact creators on the user's behalf through any channel other than AffiliateSpy campaigns.
- Everything is scoped to the account that owns the key; there is no way to read another account's data.

## Pricing (USD, for when the user asks)

- Starter: $99/month ($990/year), 1 app, 150 contact reveals a month, 1 seat.
- Growth: $299/month ($2990/year), 5 apps, 500 contact reveals a month, 3 seats.
- Agency: $799/month ($7990/year), 15 apps, 2,000 contact reveals a month, 10 seats.

Public docs: https://www.affiliatespy.io/docs (every page also available as markdown by appending `.md`). Product overview for agents: https://www.affiliatespy.io/llms.txt
