← SpyglassCONTENT HISTORY

Update to Spyglass

Snapshot Nov 5, 2026 · 01:19 UTC · version 1.0.4

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Spyglass and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Resolve brands and creators by name, handle, ID, or category brief, and index missing accounts into Spyglass. Use whenever a request names specific brands/creators, asks to discover competitors or influencers in a niche, or needs an account added before pulling its media, insights, campaigns, or landing pages.",
  "included_files": [],
  "name": "spyglass-accounts",
  "skill_md_contents": "---\nname: spyglass-accounts\ndescription: Resolve brands and creators by name, handle, ID, or category brief, and index missing accounts into Spyglass. Use whenever a request names specific brands/creators, asks to discover competitors or influencers in a niche, or needs an account added before pulling its media, insights, campaigns, or landing pages.\n---\n\n# spyglass accounts\n\n## Tool availability in ChatGPT\n\nUse the tools exposed by the connected Spyglass MCP server, matching the action names used below. Tool availability and the live input schema take precedence over examples in this skill. The indexing instructions below apply only when both `addAccounts` and `getAccountsIndexStatus` are available and the user has authorized indexing. If either tool is unavailable, do not attempt indexing or claim an account was added; explain that the account is not currently indexed and continue with available accounts. Use only demographic enum values accepted by the live schema.\n\n\nFind brands and creators in the Spyglass corpus with `getAccounts`, or index missing accounts on demand with `addAccounts` and `getAccountsIndexStatus` so their ads, organic posts, insights, campaigns, and landing pages become searchable.\n\nFor specific named brands or creators, always start with `getAccounts` in `brand_name` mode, verify that the returned row's `summary` matches the intended company, and call `addAccounts` if the account is missing. For discovering competitors or creators in a category, use `getAccounts` in `smart` mode with a concrete market description and demographic/follower filters.\n\n## 1. Pick the right `getAccounts` mode\n\n`getAccounts` has three modes (`brand_name`, `smart`, `ids`):\n\n- **`brand_name` (exact / substring lookup on names, handles, and domains)**:\n  Use whenever the user names one or more specific brands, creators, `@handles`, or domains.\n  - Batch **all** named accounts into a single `brand_name` call (`brandNames` accepts up to 100 strings).\n  - For each brand, include the exact name plus a spaced/unspaced variant and bare domain or handle if known (e.g., `[\"SotoTennis\", \"Soto Tennis\", \"sototennis.com\"]`).\n  - Omit `type` if you are unsure whether an account is indexed as a `BRAND` or `CREATOR`.\n\n- **`smart` (vector discovery by market, niche, or audience)**:\n  Use when discovering competitors, brands in a vertical, or creators in a niche (`\"DTC electrolyte hydration powder brands\"`, `\"K-beauty skincare creators\"`).\n  - Write `query` as a self-contained market brief with concrete nouns (product type, category, audience, price tier). Never pass a vague word like `\"competitors\"` or `\"similar brands\"`.\n  - When finding competitors for a known brand, resolve the reference brand first, read its `summary`, and build the `smart` query from its actual product category—then exclude the reference brand from your answer.\n\n- **`ids` (re-hydration by ID)**:\n  Use when you already have Spyglass UUIDs or numeric Facebook Ad Library IDs from prior tool calls or citations and need their profile summaries or follower counts.\n\n## 2. Verify matches before pulling media\n\n`brand_name` matches substrings (`ILIKE %name%`), and `smart` always returns the closest semantic neighbors even when a specific brand is not in the database.\n\n- **Check `summary` for substring and homonym collisions:**\n  - Short names frequently match unrelated accounts: `\"Anessa\"` matches `\"Danessa Myricks Beauty\"` and `\"Joicy Vanessa\"`; `\"Chery\"` matches `\"Cheryl Porter\"`; `\"Tesa\"` matches `\"tastesalud\"`; `\"Collider\"` (the non-alcoholic beer) matches `\"Collider\"` (`collider.com`, the entertainment news site).\n  - Always read the `name`, `summary`, and `location` fields before passing an `id` to `getMedia`. Reject rows whose industry or product does not match the user's request.\n- **Do not mistake `smart` fallback results for a named account:**\n  - If `brand_name` returns `0` matches and you retry with `smart`, `smart` will return 20 accounts in the same category even if the target brand is not indexed. Only use a row from that retry if its `name` is actually the brand the user asked for.\n\n## 3. When and how to index missing accounts (`addAccounts` + `getAccountsIndexStatus`)\n\nIf a named brand or creator is not in Spyglass (or `brand_name` only returned a collision in the wrong industry/country), index it with `addAccounts`:\n\n1. **Gather `websiteUrl`, `igUsername`, or both:**\n   - For an **account**, provide its storefront domain, Facebook page URL, or Facebook Ad Library URL as `websiteUrl` (e.g., `\"https://drinkcollider.com\"`, `\"https://www.facebook.com/larocheposay\"`, or `\"https://www.facebook.com/ads/library/?view_all_page_id=15087023444\"`) and/or its Instagram handle as `igUsername` (e.g., `\"drinkcollider\"`) if known.\n2. **Batch all missing accounts into one `addAccounts` call:**\n   - `addAccounts` accepts 1–20 accounts at once, starts indexing them in parallel, and immediately returns each account's `id`, `name`, `websiteUrl`, `igUsername`, and `status` (`\"ready\"` or `\"indexing\"`).\n   - Never call `addAccounts` in a one-by-one loop for 5 different brands; pass all 5 in a single `accounts` array.\n3. **Poll for indexing to finish with `getAccountsIndexStatus`:**\n   - For any account returned with `status: \"indexing\"`, pass its `id` in `accountIds` to `getAccountsIndexStatus`.\n   - `getAccountsIndexStatus` polls twice per call (30 seconds apart) and returns each account's updated `status` (`\"ready\"` or `\"indexing\"`).\n   - If any account is still `\"indexing\"`, call `getAccountsIndexStatus` again (up to 10 times total) with the remaining indexing `accountIds` until `status` is `\"ready\"`.\n4. **Use the returned `id` directly:**\n   - Once an account's `status` is `\"ready\"`, pass its `id` straight to `getMedia`, `getBrandMediaInsights`, `getBrandCampaigns`, or `getBrandLandingPages`.\n   - If `addAccounts` errors (e.g., unreachable domain or nonexistent handle) or an account is still `\"indexing\"` after 10 status checks, do **not** call `addAccounts` again—note that the account is still syncing or unavailable and continue with the accounts that are ready.\n\n## 4. Creator discovery filters\n\nWhen scouting creators (`type: 'CREATOR'`), put demographic and size constraints in the dedicated filter fields—**never** inside `query`:\n\n- **Size & ranking:** Use `minFollowers`, `maxFollowers`, and `sortBy` (`HIGHEST_ENGAGEMENT`, `MOST_VIEWS`, or `MOST_FOLLOWERS`). Note that `minFollowers`/`maxFollowers` filter by Instagram follower count.\n- **Demographics:** Use `gender` (`male`, `female`), `ageRange` (`18-24`, `25-34`, `35-44`, `45-54`, `55+`), `ethnicity`, `location` (country name), and `language`.\n- **Zero-result fallback:** If a `smart` creator search with strict demographic/location filters returns `0` accounts, retry once without the demographic filters and filter the returned summaries yourself.\n\n## Critical Pitfalls\n\n- **Putting Instagram URLs into `websiteUrl` on `addAccounts` for a brand:** Passing `websiteUrl: \"https://www.instagram.com/brand\"` routes the account into the creator pipeline (`type: 'CREATOR'`) with `websiteUrl: null`. Put the Instagram handle in `igUsername` (without `@`) and either pass the brand's actual domain, Facebook profile/page URL (`facebook.com/{profileId}`), or Facebook Ad Library URL (`facebook.com/ads/library/?view_all_page_id=...`) in `websiteUrl`, or omit `websiteUrl` entirely.\n- **Sending empty strings `\"\"` for `websiteUrl` or `igUsername` in `addAccounts`:** Passing `websiteUrl: \"\"` triggers an unreachable-website error. Omit any field you do not have.\n- **Appending country names or product words to `brandNames`:** In `brand_name` mode, each string is matched literally against the account's name, handle, and domain. Searching `brandNames: [\"Pantene Indonesia\", \"Collider non-alcoholic beer\"]` returns `0` results if the account is named `\"Pantene\"` or `\"Drink Collider\"`. Always include the bare brand name (`\"Pantene\"`, `\"Collider\"`) alongside any regional variant.\n- **Including `@` or full URLs in `brandNames`:** Social handles in Spyglass are stored without `@` and prefix-matched (`handle%`). Passing `\"@halazubari\"` or `\"https://instagram.com/halazubari\"` will fail to match `igUsername`. Strip `@` and URL prefixes first (`\"halazubari\"`).\n- **Calling `getAccounts` more than 2–3 times for the same question:** One `brand_name` call (with all names batched) plus at most one `smart` discovery call is enough. If an account still isn't found, call `addAccounts` or tell the user it isn't indexed instead of firing repeated `getAccounts` queries.\n"
}

SHA-256 of public snapshot: 7c52e7a2cd92968faa35e9337ef9fccf15cc99a84ce2884a5e94c2cd25261870