---
name: find-best-of-roundups-for-your-app
description: "Find the 'best of' roundup and review pages ranking for a product's keywords, see which competitors they feature and whether the user is missing, and get the writer's contact to pitch a placement, through AffiliateSpy. Use when a user asks how to get listed in best-of articles, roundups, listicles, review sites or comparison pages, or how to build backlinks and placements for their app or site."
license: MIT
metadata:
  version: "1.2.0"
  homepage: https://www.affiliatespy.io/skills/find-best-of-roundups-for-your-app/SKILL.md
  mcp: https://www.affiliatespy.io/api/mcp
  openapi: https://www.affiliatespy.io/openapi.json
  vendor: AffiliateSpy (Savassi Limited)
---

# Find the best-of roundups your customers read

## When to use

The user wants to appear in the articles their customers read before choosing ("best meal prep apps", "top X for Y"), or asks about listicle placements, roundup links, review-site coverage or share of voice. This skill answers "which pages, who writes them, where are competitors listed and we are not", then hands the contact to the outreach flow.

## Golden path

1. `get_account` (no plan yet? run the no-plan path from Setup first), `list_apps`.
2. `list_keywords`: the tracked search keywords and how many roundups each one has. If the keywords do not match what the user's customers search, the user edits them in the dashboard (app settings).
3. `list_websites`: every roundup and review page ranking for those keywords with its SERP position, the competitors it features and a features-you flag. Rank the gaps: pages that feature two or more competitors and not the user, highest SERP position first. That is the placement list.
4. For each target page, the writer or site is a creator record: `get_creator` for the evidence and `reveal_contact` (metered; say the cost) for the verified email.
5. `create_campaign_draft` for the placement pitch; ask before `launch_campaign` (guarded). Track replies with `list_inbox_threads` and `move_deal_stage`.
6. Re-run monthly: weekly scans refresh positions, so the same tools show new roundups and lost placements.

## What to tell the user up front

- Placements are earned or paid at the writer's discretion; AffiliateSpy finds the page and the person, it does not sell inclusion. Typical paid listicle inclusion elsewhere costs $135 to $400 per slot, which is a useful anchor when a writer quotes.
- Coverage depends on the tracked keywords: fix the keywords before judging the list.

## 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.

### Creators

- `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.

### 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

- `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

- `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.


### 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.).
- `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.).

## 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
