---
name: "Noxinfluencer"
repo: https://github.com/noxinfluencer/skills
source: https://github.com/noxinfluencer/skills/blob/HEAD/skills/noxinfluencer/SKILL.md
license: not specified
install: "npx skills add noxinfluencer/skills --skill noxinfluencer"
page: https://100xlab.com/resources/agent-skills/noxinfluencer-skills--noxinfluencer--ftbz2e
---

# NoxInfluencer

Full-workflow creator and marketing-ops skill for influencer discovery, due diligence, platform email outreach, external contact retrieval, campaign video monitoring, campaign/collection operations, CRM/email/message/product-center/short-link/affiliation operations, brand monitoring, and exports across YouTube, TikTok, and Instagram.

The user interacts through natural language. Execute CLI commands yourself and report results in plain language. Never expose raw commands to the user.

## When to Use

- User wants to find, evaluate, or contact creators / influencers / KOLs
- User wants NoxInfluencer campaign, collection, CRM, email/message, product-center, short-link, affiliate, export, or brand-monitor operations
- User needs to set up NoxInfluencer access or check quota
- User wants to monitor video campaign performance
- User hits an auth, quota, or CLI error

## What This Skill Does Not Do

- Draft outreach emails, negotiation copy, or partnership messages from scratch
- Send email/message tasks or update CRM records without explicit user approval
- Make final campaign budget allocation, media-plan, or partnership decisions
- Generate creative briefs or interpret video content beyond available platform metrics
- Operate external CRM, email, messaging, spreadsheet, or ad platforms outside NoxInfluencer
- Replace legal or commercial review of contracts, disputes, or brand-safety decisions

## Core Principles

### Agent-First

The user does not operate the CLI. You do. Run commands silently, tell the user the result. Only share URLs when the user needs to take action in a browser (sign in, register, authorize CLI login, subscribe).

### CLI Self-Description

The CLI is self-describing — use it instead of memorizing parameters:

- **Parameters**: `noxinfluencer schema <cmd>` (e.g., `schema creator.search`; quoted path form `schema 'creator search'` also works)
- **Help**: `noxinfluencer <cmd> --help`
- **Diagnostics**: `noxinfluencer doctor`
- **Cost planning**: `noxinfluencer pricing tools --charged-only` shows current server-side Skill Credit prices; `noxinfluencer quota usage --days 7` reviews recent consumption
- **Browser login**: `noxinfluencer login` opens NoxInfluencer, reuses the SaaS login session, and saves/reuses a non-expiring API key locally
- **Command-tree check**: `noxinfluencer schema --all` must include `campaign`, `collection`, `email`, `message`, `crm`, `product`, `short-link`, `affiliation`, `brand-monitor`, `export`, `feedback`, `quota`, `pricing`, and `agent`
- **Exit codes**: `noxinfluencer agent exit-codes`
- **Preview**: `--dry-run` (shows request without executing)
- **Language routing**: `--lang zh` switches all URLs to `cn.noxinfluencer.com`

## Routing Cheat Sheet

Use `noxinfluencer schema <cmd>` for exact parameters. Prefer broad command families over memorizing flags:

- Creator sourcing: `creator search`, `creator search-filter*`, `creator lookalikes`
- Creator reads: `creator profile/audience/content/cooperation`; use `creator contacts` only for visible/exported contacts
- Monitoring: `monitor list/create/add-task/tasks/history/summary`
- Operations: `campaign`, `collection`, `crm`, `email`, `message`, `product`, `short-link`, `affiliation`, `export`
- Brand monitoring: `brand-monitor ...`
- Setup, quota, and pricing: `login`, `doctor`, `quota`, `quota usage`, `pricing`, `pricing tools`, `agent exit-codes`
- Feedback: `feedback submit/inbox/get`

If the user does not have a `creator_id`, the first creator read may use `--url` or `--platform --channel-id`; afterwards preserve and reuse returned `creator_id`. For marketing-ops commands, expect JSON bodies and dry-run defaults; use `schema <cmd>` and `--force` only after explicit approval.

### User Feedback

If the user wants to report a bug, confusing behavior, data issue, suggestion, or feature request, offer to submit feedback through `noxinfluencer feedback submit`. Ask for a short confirmation before sending. Attach screenshots or logs with `--file` when available. Feedback is free, does not consume Skill quota, and may receive asynchronous follow-up; check `noxinfluencer feedback inbox` or `noxinfluencer feedback get <feedback_id>` later.

---

## 1. Getting Started

Run `noxinfluencer doctor`, then fix only what is missing:

1. No CLI or stale command tree → ask the user to install `@noxinfluencer/cli@latest`; verify with `schema --all`.
2. No API key → prefer `noxinfluencer login`. Manual API-key handoff is fallback only; use `auth --key-stdin`, never argv/logs.
3. Configured → run `quota` and report blocking quota or entitlement issues.

### Quota and Billing

Run `quota` yourself and report the snapshot. For cost planning or optimization, use `pricing tools --charged-only` for current per-action prices and `quota usage` for historical consumption. API-backed calls may consume Skill quota and may also depend on SaaS-side capability quota or entitlement. If the response includes `action.url`, pass it to the user.

---

## 2. Discovering Creators

Turn an open-ended search into a usable shortlist.

Ask for only the missing essentials: platform, niche, region, creator size, and whether email signal matters. Search directly once the request is specific enough. Multi-platform sourcing requires separate platform searches.

Use `schema creator.search` for flags. Search a known creator name/handle with `--creator_name`; use `--keywords` for topic discovery, never both. Use `--keyword_match all` only when the user requires every keyword to match. Add `--has_email true` when platform email outreach needs creators with an email signal, but do not imply visible email was retrieved. For pagination, reuse the prior filters and `data.search_after`; prefer a JSON body.

Creator search and lookalike discovery charge by returned creator count, not by a fixed page request. Check `pricing tools --action creator_search` or `--action creator_lookalikes` when the user asks about cost. Default to smaller, purposeful pages for exploration; use larger pages only when the user asks for a broad shortlist or bulk follow-up.

### Lookalike Discovery

Use `creator lookalikes` when the user asks for creators similar to a source creator or URL. Treat results as recommendations, use the returned opaque `creator_id` values directly, and save them separately only after the user chooses targets.

### Shortlist Presentation

Present 3–5 comparable candidates first: name, platform, size, performance, geography, tags, and why they match. If results are noisy, ask for one narrowing filter. Preserve `creator_id` for follow-up actions.

---

## 3. Analyzing Creators

Help the user decide whether a creator is worth pursuing. Lead with a verdict, not a wall of numbers.

Prefer `creator_id` from prior results. Check the user's requested concern first; otherwise use profile → audience → content → cooperation. Use `--detail` only when deeper evidence is needed, and skip platform-limited dimensions unless relevant. Return verdict first, then evidence.

### Verdict Framework

Use one of four conclusions: high-priority, viable with risks, needs manual review, or not a priority. Always surface dispute/negative cooperation signals. See `{baseDir}/references/verdict-heuristics.md` for detailed heuristics.

---

## 4. Retrieving Contacts

Retrieve visible contact info only when the user explicitly wants exported contact details, external outreach, or to use email outside NoxInfluencer.

Strong rule: platform email outreach must not call `creator contacts` unless the user explicitly asks for visible/exported contact info. Use search/profile `creator_id` values in `email recipients add/replace`. If the user vaguely asks to "find emails and send", default to platform email and mention that exporting visible emails uses extra contact quota. Email sending may still consume the email service's own quota.

When contacts are explicitly needed, run `creator contacts` for the selected creator and return only the visible contact info plus quality signal. If email is missing or low-confidence, say so plainly. Do not add outreach recommendations or restate creator metrics.

---

## 5. Tracking Performance

Manage video monitoring projects and tracked videos. Operational only — manages monitoring, not performance judgment.

List projects first when unclear. Create a project before adding videos. Use summary for project-level performance, tasks for tracked videos, and history for time-series detail. Prefer stable IDs after lookup and preserve returned `creator_id` for later creator reads. Monitoring manages data collection; do not turn it into a creator verdict.

---

## 6. Marketing Ops

Operate NoxInfluencer campaign, collection, CRM, email, message, product-center, short-link, affiliation, and export workflows. Stay operational: retrieve state, prepare changes, preview impact, then apply only after approval.

### Workflow

1. Identify the target domain and read current state first when IDs are unclear.
2. For platform email outreach to creators found in NoxInfluencer, use the email-task path and add recipients by `creator_id`; do not retrieve contacts first. See the CLI schema and `{baseDir}/references/marketing-ops.md`.
3. Use `message send` or `message schedule` only for existing `thread_id` replies. If no thread exists, offer the email-task path for platform creators.
4. For JSON-first commands, run `schema <cmd>` and prepare the minimal `--body-file` object required by the CLI.
5. For staged workflows, run `validate` first, then `preview`, then `apply --force` only after user approval.
6. For direct mutations, rely on dry-run first unless the user has already approved the exact action.
7. For search-result or email-recipient deduplication, use the matching `... options` command first, then apply only the returned schema/body patch that matches the user's intent.
8. Use `short-link` for normal Nox short links only; use `affiliation` for Shopify affiliate campaigns, members, tracking links, discount codes, and performance reads.
9. If Shopify store authorization is missing, send the user to SaaS; do not try to authorize stores inside the Skill.
10. For async exports, create the export task, poll with `export get` or `export list`, then download with `export download --output` only when ready.

Do not draft outreach copy. If the user asks to send or schedule an email task or message, confirm the task/thread, recipients, sender, scheduled time, and content are already approved.

See `{baseDir}/references/marketing-ops.md` for domain routing, mutation guardrails, and export handling.

---

## 7. Brand Monitoring

Use brand-monitor commands for owned/competitor brand analysis and brand asset exports. This is distinct from creator due diligence: it starts from `brand_id`, not `creator_id`.

### Workflow

1. List or get brand monitors when `brand_id` is unclear.
2. Use matrix/strategy reads for brand-level analysis: competition, cooperation, influencer portrait, defense gap, and product signals.
3. Use asset list commands for raw influencer/content/tag/product rows; these are JSON-first and usually require `--body-file`.
4. Product signal commands currently support YouTube only. Do not run them for TikTok or Instagram unless the CLI schema later shows support.
5. Use export commands for downloadable brand assets; follow up through shared `export` commands.
6. Treat `add`, `unlock-base`, `unlock-high`, and all `*-export` commands as mutations or async job creation: dry-run first, `--force` only after approval.

See `{baseDir}/references/brand-monitor.md` for command routing and platform boundaries.

---

## Error Handling

For API-backed failures (`quota`, `pricing`, `creator`, `monitor`, `campaign`, `collection`, `email`, `message`, `crm`, `product`, `short-link`, `affiliation`, `brand-monitor`, `export`), use the CLI response's `action` field when present:
- `action.url` — where the user should go
- `action.hint` — what to do

Local/helper commands (`auth`, `doctor`, `schema`, `env`, `agent exit-codes`) may not include `action`. Read their native output directly instead of assuming the API error envelope.

For unexpected failures, run `doctor` as a first diagnostic step.

## References

- `{baseDir}/references/cli-response-format.md` — response envelope differences and error action handling
- `{baseDir}/references/marketing-ops.md` — campaign, collection, CRM, email/message, export workflows and mutation guardrails
- `{baseDir}/references/brand-monitor.md` — brand monitor routing, YouTube-only product signals, export boundaries
- `{baseDir}/references/platform-support.md` — data availability by platform
- `{baseDir}/references/search-filters.md` — filter selection by user intent
- `{baseDir}/references/verdict-heuristics.md` — detailed due-diligence rules and output structure

---

## Supporting file: references/brand-monitor.md

# Brand Monitor Workflows

Use brand-monitor commands for brand-level market intelligence and asset exports. This workflow starts from `brand_id`; do not substitute `creator_id`.

## Routing

| User intent | Command family |
|-------------|----------------|
| List available brand monitors | `brand-monitor list` |
| Inspect one monitored brand | `brand-monitor get <brand_id>` |
| Compare brand competition | `brand-monitor competition-matrix <brand_id>` |
| Analyze cooperation strategy | `brand-monitor cooperate-matrix <brand_id>` |
| Summarize influencer portrait | `brand-monitor influencer-portrait <brand_id>` |
| Find defense gaps | `brand-monitor defense-gap <brand_id>` |
| Read product trend/category signals | `brand-monitor product-pub-trend`, `product-category` |
| Read product strategy signals | `brand-monitor product-sov-analysis`, `product-tae-analysis`, `product-pp-analysis`, `product-promotion-matrix`, `product-promotion-distinction` |
| Query brand asset rows | `brand-monitor influencer-list`, `content-list`, `tag-list`, `product-list` |
| Create brand asset exports | `brand-monitor influencer-export`, `content-export`, `tag-export`, `product-export` |
| Add or unlock a monitored brand | `brand-monitor add`, `unlock-base`, `unlock-high` |

## Platform Boundaries

- Core brand monitor reads support YouTube, TikTok, and Instagram where the CLI schema permits.
- Product signal commands currently support `youtube` only. Do not call product signal commands for TikTok or Instagram unless a future schema explicitly shows support.
- Asset list commands are JSON-first. Use `--body-file` and inspect schema usage notes before building selectors.

## Output Rules

- Brand overview: report brand name, `brand_id`, access/data level, quota state, and obvious blockers.
- Matrices and strategy reads: summarize top rows and the decision implication; do not dump every normalized field.
- Asset lists: present comparable rows and include pagination state when present.
- Product signals: state that the result is YouTube-only if the user asked for cross-platform analysis.
- Exports: preserve `export_id` and route follow-up status/download through shared `export` commands.

## Mutation Rules

- `add`, `unlock-base`, `unlock-high`, and all `*-export` commands are mutations or async job creation.
- Dry-run first unless the user already approved the exact brand and action.
- Use `--force` only after approval.
- For unlock operations, explain that quota/entitlement may be consumed before executing.

---

## Supporting file: references/cli-response-format.md

# CLI Response Format

## API-backed Commands

These commands return the standard API envelope:

- `creator ...`
- `monitor ...`
- `campaign ...`
- `collection ...`
- `email ...`
- `message ...`
- `crm ...`
- `brand-monitor ...`
- `export ...`
- `quota`
- `pricing`

Successful responses include `success`, `data`, `summary`, and `meta`. Some current endpoints may also include a legacy compatibility field named `credits`.

Notes:

- Treat `quota` response data as the canonical Skill quota snapshot
- `pricing` returns membership plans; `pricing tools` returns current server-side per-action Skill Credit prices
- `quota usage` returns historical calls, credits, trend, and recent activity for cost analysis
- Some current API envelopes may still include a legacy `credits` field for compatibility; do not treat it as the primary quota model
- Mutation commands default to dry-run; `--force` executes the write after user approval
- Non-GET writes automatically use `Idempotency-Key`; `--idempotency-key` can override it for automation
- JSON-first commands declare `supports_body_file: true` in schema and require `--body-file`
- `export download` writes binary data to `--output`, not stdout

Error responses include an `action` field with next-step guidance:

```json
{
  "success": false,
  "error_code": "INSUFFICIENT_CREDIT",
  "summary": "Insufficient credit quota",
  "action": {
    "type": "redirect",
    "url": "https://www.noxinfluencer.com/skills/usage-billing",
    "hint": "Open billing to renew or upgrade your available quota."
  }
}
```

The current server may still use legacy wording like `INSUFFICIENT_CREDIT` or `Insufficient credit quota`. Interpret that as "Skill quota is exhausted" for user communication.

## Local Commands (different format)

These commands have their own response structures — do not assume the API envelope:

| Command | Response format |
|---------|----------------|
| `doctor` | `{ "checks": [...], "ok": boolean }` |
| `auth` | `{ "success": boolean, "message": string }` |
| `env` | `{ "success": true, "data": { "environment": string, "server_url": string } }` |
| `schema` | Command schema JSON (no envelope) |
| `agent exit-codes` | Stable CLI exit-code catalog |

## Agent Diagnostics

- Use `--trace-json` when a harness or eval needs structured request traces on stderr.
- Use `schema --all` to verify the installed CLI exposes the expected modern command tree, including `campaign`, `collection`, `email`, `message`, `crm`, `product`, `short-link`, `affiliation`, `brand-monitor`, `export`, `feedback`, `quota`, `pricing`, and `agent`. Version output alone is not sufficient when a local/global install has stale compiled files. If reinstalling `@noxinfluencer/cli@latest` still lacks the expected command groups, stop the affected workflow and report a CLI package / command-tree mismatch.
- Use `noxinfluencer agent exit-codes` to distinguish retryable failures such as rate limits or temporary upstream failures from invalid requests and auth problems.
- Use `doctor` as the first diagnostic step when the failure cause is unclear.

---

## Supporting file: references/marketing-ops.md

# Marketing Ops Workflows

Use this reference for NoxInfluencer campaign, collection, CRM, email, message, and export operations. Keep command parameters runtime-discovered with `noxinfluencer schema <cmd>`.

## Domain Routing

| User intent | Start with |
|-------------|------------|
| Find or inspect campaigns | `campaign list`, `campaign get`, `campaign dashboard`, `campaign dropdown` |
| Create or change campaign skeleton data | `campaign init`, `campaign create`, `campaign update`, `campaign delete` |
| Find or inspect collections | `collection list`, `collection get`, `collection items`, `collection resources` |
| Add creators from search/profile results to collections | `collection add-creators` |
| Import owned creator links into one collection | `collection import-file` |
| Find creators similar to a source creator | `creator lookalikes` |
| Batch move/copy/delete/label collection members | `collection batch-* validate`, then `preview`, then `apply` |
| Refresh collection base/email data or unlock audience | `collection refresh* validate`, then `preview`, then `apply` |
| Add one whole collection and platform slice to CRM | `collection add-to-crm validate`, then `preview`, then `apply` |
| Query or update NoxInfluencer CRM channels | `crm list`, `crm get`, `crm update`, `crm groups ...` |
| Manage CRM labels for batch tagging | `crm labels list/create/update/delete` |
| Manage product-center records and tags | `product list/get/create/update/delete`, `product tags ...` |
| Manage Shopify affiliate campaigns and members | `affiliation stores list`, then `affiliation campaigns ...` / `affiliation members ...` |
| Send platform email outreach to creators | `email create`, then `email recipients add/replace` with creator search/profile IDs, `email content save`, optional `email sender update`, optional `email attachments ...`, then `email send` or `email schedule` |
| Manage email tasks | `email list`, `email drafts`, `email get`, `email create`, `email update`, `email recipients ...`, `email content ...`, `email sender ...`, `email report`, `email team-summary`, `email team-breakdown` |
| Manage email recipient deduplication | `email recipients filter options`, then `email recipients filter get/update/tasks` |
| Manage email task collaborators | `email collaborators list`, then `replace/add/remove` |
| Manage email task attachments | `email attachments list/upload/delete` |
| Send or schedule an existing email task | `email send`, `email schedule`, `email cancel` |
| Manage message threads | `message list`, `message get`, `message projects`, `message labels`, `message coop ...`, `message draft ...`, `message attachments ...` |
| Send or schedule an existing message reply | `message send`, `message schedule`, `message cancel` |
| Submit product feedback or a bug report | `feedback submit`, then `feedback inbox` / `feedback get` |
| Inspect or download async exports | `export list`, `export get`, `export download` |

## Outreach Routing

- For NoxInfluencer platform email outreach, do not call `creator contacts` first. Create or select an email task, add search/profile result `creator_id` values with `email recipients add/replace`, save user-approved content with `email content save`, set sender if needed, read back task and recipients, then ask for final approval before `email send --force` or `email schedule --force`.
- Use `creator contacts` only when the user explicitly wants visible/exported contact info or outreach outside NoxInfluencer. If the user vaguely asks to "find emails and send", choose platform email by default and say exported email retrieval uses extra contact quota.
- Email attachments belong to the email task primary project. Upload approved files with `email attachments upload <task_id> --file <path>` before `email send` or `email schedule`; use `email attachments list/delete` to inspect or remove files. Email tasks support at most 1 attachment, max 10MB. Uploading or deleting an attachment cancels an existing scheduled send, so read back the task and confirm again before scheduling.
- For one email task's reply reporting, use `email report <task_id>`. For multi-task or team-level reporting, use `email team-summary`; for SaaS team member breakdown, use `email team-breakdown`. Treat `reply_count` as email tracking replies, `replied_creator_count` as replied creators, and `inbound_message_count` as inbound reply messages. Team filters use SaaS team member `uid`, not Gmail or enterprise sender mailbox accounts. Do not recompute replies by manually scanning message threads unless the user explicitly asks for raw thread inspection.
- If the user wants in-platform DM/message, `message send` and `message schedule` require an existing `thread_id`. If the user only has an email task ID, use `message list --business_kind email_task --business_id <task_id>` to resolve the thread first. Without a thread, say that starting a new message thread is not exposed by the CLI and offer the email-task path for platform creators.
- For message-center filtering by task creator or team member, first run `message creator-filters`, then use returned `user_uid` values with `message list --creator_uids` or `message project-filters --creator_uids`.
- For message-center pending work, trust `needs_reply` / `last_message_direction`; `deal` is not the same as `unread`. If one opened task is already replied but SaaS still shows pending, inspect sibling tasks with `message projects <thread_id>`. If the user says a pending message needs no reply, do not send an empty reply or archive the channel; say task-level mark-handled is not exposed yet.
- Message attachments are thread-draft attachments. Upload files with `message attachments upload <thread_id> --file <path>` before `message send` or `message schedule`; use `message attachments list/delete` to inspect or remove draft files. Do not attach files to message templates unless the CLI schema explicitly exposes that path.
- `crm add-to-email` is only for adding existing NoxInfluencer CRM channels to an existing email task. Do not treat CRM as required when the user already has creator IDs or explicit email addresses.

## Affiliate Marketing

- Use `affiliation` for Shopify affiliate stores, campaigns, members, tracking links, discount codes, and performance reads. This is separate from normal `short-link`.
- Start with `affiliation stores list`. If no store is authorized or access is denied, ask the user to authorize/manage the store in SaaS; do not attempt store authorization in the Skill.
- Add NoxInfluencer creators to affiliate campaigns with search/profile `creator_id`, or use `platform + channel_id` / `custom_id` when the CLI schema calls for it.

## Deduplication and Collaborators

- Search result deduplication is a second step after `creator search`: run `creator search-filter-options`, then call `creator search-filter --body-file` with the current page `data.items[].id` values and the selected filter patch. It filters a returned page; it does not launch a fresh search.
- Email recipient deduplication is task-scoped: use `email recipients filter options` to find SaaS-aligned choices, `email recipients filter get <task_id>` to inspect saved state/counts, and `email recipients filter update <task_id> --body-file` to change it.
- Email collaborators use SaaS team `user_uid`. If the user does not know the ID, run `email collaborators list` without `task_id` first; with a `task_id`, it reads that task's current collaborator permissions. Use `add` or `remove` for incremental changes; use `replace` only when the user intends to reset the whole collaborator set.

## CRM Update Semantics

- `crm update` / `crm batch-update` may auto-create a NoxInfluencer CRM channel for valid platform `creator_id` tokens when updating cooperation status or labels. For label-only updates, the service uses the default cooperation status before applying labels.
- Use `crm labels create` when the user needs a new CRM tag ID. Use the returned `label_id` in `crm batch-update` with `labels.operation=add` or `remove`.
- Owner-only or archive-only updates do not auto-create CRM channels. Treat missing-channel failures as real failures, not successful skips.
- For batch previews and applies, report `existing_count`, `will_create_count`, and `created_count` when present; do not infer success only from requested IDs.

## Collection Add and Import

- Use `creator lookalikes` when the user asks for similar creators based on a source creator or URL. It is read-only and requires `target_platform`; save returned creator IDs with `collection add-creators` only after the user chooses targets.
- Use `collection add-creators` when the user wants to save creators returned by `creator search` or creator read commands into one or more collections. The JSON body uses `collection_ids`, `platform`, and `creator_ids`. Use `channel_ids` only when the user already has raw same-platform channel IDs. It is an add-only path, not forced collection-to-collection copy.
- Use `collection import-file <collection_id> --file <path>` for the user's owned creator links. The spreadsheet's first column should be the YouTube, Instagram, or TikTok creator URL; an optional second column may contain email/contact data. This import is accepted asynchronously, so poll `collection items <collection_id>` by platform to confirm resolved rows.
- Do not confuse these paths with collection copy/move. `add-creators` adds explicit creators to target collections; `import-file` imports owned creator URLs into one collection.

## Mutation Rules

- Write commands default to dry-run. Treat dry-run output as a preview, not completion.
- Use `--force` only after the user has approved the exact object and action.
- Feedback submission is also a write command, but it is free and does not consume Skill quota. Use it for product bugs, confusing behavior, data issues, suggestions, or feature requests. Attach screenshots/logs with `--file` when useful, and check `feedback inbox` for asynchronous follow-up.
- For staged workflows, always run `validate` before `preview`, and `preview` before `apply --force`.
- For `send` and `schedule`, confirm the task/thread, recipient scope, sender identity, scheduled time when relevant, and content approval before execution.
- Do not draft outreach or negotiation copy. If content is missing, ask the user for approved content or hand off to a writing task without invoking NoxInfluencer write commands.
- Do not operate external CRM, email, messaging, or spreadsheet platforms. These commands only affect NoxInfluencer-owned objects.

## JSON-First Commands

Many marketing-ops commands intentionally keep complex selectors in JSON bodies. When a schema requires `--body-file`:

1. Run `noxinfluencer schema <cmd>` to inspect required fields and usage notes.
2. Prepare the minimal JSON body needed for the user's request.
3. Prefer the CLI's validate/preview stages when available.
4. Preserve stable opaque IDs from responses (`campaign_id`, `collection_id`, `creator_id`, `thread_id`, `task_id`, `export_id`) for follow-up calls.

## Export Handling

- Export creation is async and usually returns `export_id`.
- Poll with `export get` or inspect with `export list`.
- Only run `export download <export_id> --output <path>` when the export is ready.
- Download writes binary data to the requested file path, not stdout. Report the output path and file metadata after completion.

---

## Supporting file: references/platform-support.md

# Platform Support

NoxInfluencer skills support three platforms. Each has some data availability differences.

## Supported Platforms

| Platform | `--platform` value | Creator ID prefix byte |
|----------|-------------------|----------------------|
| YouTube | `youtube` | `0x01` |
| TikTok | `tiktok` | `0x02` |
| Instagram | `instagram` | `0x03` |

## Data Availability by Platform

| Data Dimension | YouTube | TikTok | Instagram |
|----------------|---------|--------|-----------|
| Search | Full | Full | Full |
| Profile overview | Full | Full | Full |
| NoxScore | Full | Full | Full |
| Audience demographics | Full | Full | Partial |
| Audience authenticity | Full | Full | Limited |
| Content tags | Full | Full | Full |
| Recent content | Full | Full | Full (posts, reels, pics) |
| Cooperation detail | Full | Partial | Partial |
| Brand partnerships | Full | Partial | Limited |
| Pricing data | Full | Partial | Limited |
| Contact/email | Available | Available | Available |
| Video monitoring | Full | Full | Full |
| Brand monitor product signals | YouTube only | Not supported | Not supported |

## Content Type Splits

Different platforms have different content types that affect performance metrics:

- **YouTube**: `normal` (long-form) vs. `shorts`
- **TikTok**: All content treated as short-form
- **Instagram**: `posts`, `reels`, `pics` — metrics may be split by type

## Platform-Specific Notes

- **Null fields**: Some fields may return `null` on certain platforms. This is expected behavior, not a data error. Skills should explain that the value may be unavailable for that platform rather than treating it as a failure.
- **Creator identity fields**: All creator read responses include `creator_id`, `creator_name`, `channel_handle`, `channel_url`, and `social_media`. `channel_url` and `social_media` are enhancement data and may still be empty on some creators or platforms.
- **Audience data**: Instagram audience data may be less granular than YouTube or TikTok.
- **Cooperation data**: Pricing and communication metrics are most complete on YouTube. TikTok and Instagram may have partial or no pricing data.
- **Creator IDs**: All creator IDs in search results and creator read responses are encrypted tokens. The same creator always produces the same token. Use the token directly as the positional `<creator_id>` argument in subsequent commands without decryption.
- **Direct selectors**: The first creator read call may use `--url` or `--platform --channel-id`. Once a response returns `data.creator_id`, switch to that token for follow-up calls.
- **Monitor task identity**: `monitor add-task` and `monitor tasks` may also expose `creator_id`, `creator_name`, `channel_handle`, and `channel_url`. Treat these as best-effort task metadata; nullable fields are not a hard failure.
- **Brand monitor product signals**: Product publication, category, SOV, TAE, PP, promotion matrix, and promotion distinction commands currently support YouTube only. For TikTok or Instagram brand questions, use non-product brand monitor reads or asset lists when schema permits.

---

## Supporting file: references/search-filters.md

# Search Filter Semantics

For the full parameter list and syntax, run `noxinfluencer schema creator.search`. The single-argument command-path form `noxinfluencer schema 'creator search'` is equivalent.

This reference covers **when to use which filters** — the decision logic, not the syntax.

For SaaS hide/deduplication after a page is already returned, use `creator search-filter-options` and `creator search-filter` instead of adding more `creator search` filters.

## Filter Priority by User Intent

| User intent | Key filters to apply | Why |
|-------------|---------------------|-----|
| Known creator name or handle | `--creator_name`, `--platform` | Match creator identity instead of treating the name as a topic keyword |
| Niche sourcing | `--keywords`, `--platform` | Narrow to relevant content creators |
| Every topic must match | `--keywords`, `--keyword_match all` | Require all supplied topic keywords instead of the default any-keyword union |
| Regional targeting | `--country`, `--follower_countries` | Match campaign geography |
| Budget-constrained | `--follower_min`, `--follower_max` | Size correlates with cost |
| Platform email outreach | `--has_email true` | Only creators with known email signal; platform email can still add results by `creator_id` without retrieving visible email |
| Audience fit | `--follower_ages`, `--follower_female_pct_min`, `--follower_language` | Match audience demographics |
| Active creators | `--published_within_days` | Exclude dormant channels |
| Performance floor | `--engagement_rate_min`, `--avg_view_min` | Filter out low-engagement creators |

## Search Result Fields

Each result item includes: `id` (encrypted token), `nickname`, `tags`, `followers`, `country`, `total_videos`, `view_per_followers`, `engagement_rate`, `avg_views`, `language`.

`creator_name` and `keywords` are mutually exclusive. Name search uses the same result pricing and pagination as topic search.

Search responses also include page metadata under `data`: `page_num`, `page_size`, `total_page`, `total_size`, and `search_after`.

The `id` is an encrypted token — use it directly as the positional `<creator_id>` argument in subsequent commands. Do not try to decode it.

## Page Size and Cost

- `creator search` and `creator lookalikes` share returned-result pricing; use `pricing tools --action creator_search` or `--action creator_lookalikes` for the current server-side unit price.
- The default page size is 20 and the maximum page size is 100.
- Charge impact follows the number of returned items, not the requested `page_size`. Prefer targeted pages while refining filters; use larger pages only when the user asks for broad sourcing or bulk follow-up.

## Search Result Deduplication

- Run `creator search-filter-options` to list SaaS hide/deduplication choices and their JSON body patches.
- Run `creator search-filter --body-file` with the current page `data.items[].id` values plus one selected filter condition.
- This is page-level filtering for already returned candidates; it does not fetch another search page and does not replace the normal `creator search` filters above.

## Pagination Rules

- For a next-page request, keep the previous search filters exactly the same and send both the next `page_num` and the previous response's `data.search_after`.
- Prefer `--body-file -` for next-page requests and pass one JSON body containing the preserved filters, `page_num`, `page_size`, and `search_after`. This avoids shell globbing/quoting problems with cursor arrays.
- If using flags instead of `--body-file`, shell-quote every bracketed array argument, especially `--search_after`, for example `--search_after '[163.97083,"UCQ-P8lGwkr0Tj4phQB9diDw"]'`.
- Current CLI and server validation require `page_num > 1` when `search_after` is present, so do not try cursor-only paging.
- If `data.search_after` is missing or empty, or the current page is already the last page, tell the user there are no more results.

---

## Supporting file: references/verdict-heuristics.md

# Verdict Heuristics Reference

Detailed heuristic rules and output structure for creator due-diligence verdicts.

## Verdict Levels

### 1. High-priority collaboration candidate

All of the following hold:

- No meaningful dispute signal
- Audience quality is healthy (authenticity status is positive, no suspicious audience dominance)
- Performance is competitive for the niche (benchmark rank is above median)
- Pricing and cooperation signals do not show obvious friction (reasonable response time, acceptable pricing range)

### 2. Viable, but with clear risks

Overall profile is workable, but one or two notable concerns exist:

- Weak cooperation signals (low cooperation score, few brand partnerships)
- Performance volatility (high wave value, inconsistent engagement)
- Questionable pricing efficiency (large gap between first and final price)
- Audience demographic mismatch for the stated campaign goal

### 3. Needs manual review before proceeding

The evidence is mixed and a firm recommendation would be misleading:

- Commercial reasonableness cannot be judged confidently from available data
- One critical dimension is unclear or data is incomplete
- Conflicting signals across dimensions (strong performance but poor audience quality, or vice versa)

### 4. Not a priority collaboration candidate

Multiple weak signals appear:

- Disputes or negative cooperation history
- Poor audience quality (low authenticity, suspicious audience types)
- Below-benchmark performance across multiple metrics
- Creator is clearly a poor fit for the stated collaboration goal

## Due-Diligence Output Structure

After the verdict, organize evidence into these sections:

### 1. Data Performance

- Average views and engagement rate
- Stability: wave value and views change ratio
- Benchmark position: rank and percentile vs. peers
- Content-type splits if relevant (normal vs. shorts/reels)
- Level indicators (1-5 scale): avg_views_level, wave_level, engagement_rate_level

### 2. Audience Quality

- Audience authenticity (value, status, ratio range)
- Audience type distribution (real, suspicious, inactive)
- Demographic fit: region, language, age, gender distributions
- Marketing indicators: positive_audience_pct, promo_interested_audience_pct, promo_attractiveness, promo_professionalism

### 3. Cooperation Risk

- Dispute types (if any)
- Cooperation score and tendency
- Cooperation pros and cons lists
- Ad video ratio and frequency

### 4. Commercial Reasonableness

- Estimated price range (avg, min, max)
- First price vs. final price gap
- Response speed (avg_response_hours)
- Collaboration efficiency (avg_contact_days, avg_contact_chats, avg_collaboration_days)
- Active period and communication patterns
- Existing brand partnerships (brand names, video counts, engagement rates)

### 5. Final Recommendation

- Whether to continue toward outreach
- What should be double-checked manually
- Whether the next step should be contact retrieval or shortlist replacement

## Interpretation Principles

- Dispute history and negative cooperation signals are decision-critical — always surface them prominently.
- Benchmark position provides context but is not the sole determinant.
- Pricing reasonableness should be evaluated relative to performance, audience quality, and cooperation signals, not in isolation.
- When evidence is mixed, prefer "Needs manual review" over false confidence.
- When two or more critical dimensions are missing or platform-limited, do not force a confident verdict.
- When only one dimension was checked, present the answer as a scoped judgment, not a full verdict.
