Operate the Refluenced platform as the authenticated staff user, in a brand's context where the work belongs to one. When a user names a brand or agency for any action (selecting, reading, editing, or targeting it by id), resolve the name to an id with list-brands or list-agencies first, and never pick one silently when it is ambiguous: list the matches with their ids and agencies and ask which they mean — the server enforces this and refuses an ambiguous name. Once chosen, carry that id with disambiguated: true on every following action for that scope — asked once, then never again. One exception: when a user means Refluenced as our own company (the operator itself, e.g. a campaign for ourselves), that is company id 24 — use it with disambiguated: true rather than listing the other 'Refluenced' companies, unless they clearly mean a different external brand. To create a campaign, first ask whether they want it AI-drafted (create-campaign-with-ai, recommended) or manual (create-campaign) — ask even when fields are given, and skip only if they named a method. When a user attaches or pastes a file you cannot pass as a local path or public URL (the normal hosted case), call request-file-upload for a one-time upload link, not the web app. When no purpose-built tool answers a data question — including when one returns figures but not the field it turns on (e.g. campaign dates) — fall back to the admin-only open-data tools (describe-data-schema, then one read-only run-data-query); surface any non-admin refusal.
Before any Meta Ads tool, load the meta-ads-operator skill and follow it. The server enforces the hard safety rules in code — notably everything is created PAUSED and only a configured activator may activate it. If the skill is unavailable here, build paused only.
Present any chart (a breakdown, ranking, comparison, or trend) by calling render-chart, never the client's own default chart card, and keep the figures alongside it.
Discoverability
2 of 6 checks33/100
Client listings and public setup information.
mcp.json or server-card.json
Either mcp.json or an MCP Server Card declaring this endpoint passes.
The MCP Server Card declares this server's exact endpoint.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Accept every pending brand-ambassador candidate for a brand at once — the web's 'accept all' action. Each accepted creator joins the brand's ambassador group and is push-notified, so it is preview-then-confirm: the preview reads the pending count and names the brand, and the acceptance runs in the background, returning how many were queued. To accept a single candidate instead, use accept-ambassador. Scope it by the brand's companyId (from list-brands — resolve and disambiguate first).
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId",
"pendingCount",
"performed",
"queuedCount"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand whose candidates were accepted"
},
"performed": {
"type": "boolean",
"description": "Whether the bulk accept was queued (true) or this is a preview only (false)."
},
"queuedCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many candidates were queued for acceptance, or null on preview"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending candidates there were (shown on preview), or null after the action"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "accept-all-ambassadors",
"title": "Accept all pending brand-ambassador candidates",
"description": "Accept every pending brand-ambassador candidate for a brand at once — the web's 'accept all' action. Each accepted creator joins the brand's ambassador group and is push-notified, so it is preview-then-confirm: the preview reads the pending count and names the brand, and the acceptance runs in the background, returning how many were queued. To accept a single candidate instead, use accept-ambassador. Scope it by the brand's companyId (from list-brands — resolve and disambiguate first).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId",
"pendingCount",
"performed",
"queuedCount"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand whose candidates were accepted"
},
"performed": {
"type": "boolean",
"description": "Whether the bulk accept was queued (true) or this is a preview only (false)."
},
"queuedCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many candidates were queued for acceptance, or null on preview"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending candidates there were (shown on preview), or null after the action"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Accept a pending brand-ambassador candidate for a brand — adds the creator to the brand's ambassador group and push-notifies them, so it is preview-then-confirm and names the brand. Target it by the candidate's ambassadorId (from list-potential-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown or ineligible candidate (pending_ambassador_not_found, ambassador_not_eligible), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
ambassadorId
The candidate's ambassadorId, from list-potential-ambassadors.
Clear enough to supply this argument.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassador",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the candidate was accepted for"
},
"performed": {
"type": "boolean",
"description": "Whether the candidate was accepted (true) or this is a preview only (false)."
},
"ambassador": {
"anyOf": [
{
"type": "object",
"required": [
"acceptedOn",
"ambassadorId",
"influencer",
"referralCodeType",
"status"
],
"properties": {
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "The ambassadorship status after the action"
},
"acceptedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was accepted (ISO 8601), or null"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"instagramMedianViews",
"instagramUsername",
"isVerified",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokLastPeriodVideoCount",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the message and punishment tools"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isVerified": {
"type": "boolean",
"description": "Whether the creator has passed platform verification"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"ugcVerified": {
"type": "boolean",
"description": "Whether the creator is UGC-verified"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok median views, or null"
},
"instagramMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram median views, or null"
},
"tiktokLastPeriodVideoCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos posted in the last period, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator behind the referral, or null when they have no influencer profile"
},
"ambassadorId": {
"type": "number",
"description": "The referral's id — the ambassadorId for accept/reject/remove"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The accepted ambassador, or null on a preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "accept-ambassador",
"title": "Accept a brand-ambassador candidate",
"description": "Accept a pending brand-ambassador candidate for a brand — adds the creator to the brand's ambassador group and push-notifies them, so it is preview-then-confirm and names the brand. Target it by the candidate's ambassadorId (from list-potential-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown or ineligible candidate (pending_ambassador_not_found, ambassador_not_eligible), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
},
"ambassadorId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The candidate's ambassadorId, from list-potential-ambassadors."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassador",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the candidate was accepted for"
},
"performed": {
"type": "boolean",
"description": "Whether the candidate was accepted (true) or this is a preview only (false)."
},
"ambassador": {
"anyOf": [
{
"type": "object",
"required": [
"acceptedOn",
"ambassadorId",
"influencer",
"referralCodeType",
"status"
],
"properties": {
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "The ambassadorship status after the action"
},
"acceptedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was accepted (ISO 8601), or null"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"instagramMedianViews",
"instagramUsername",
"isVerified",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokLastPeriodVideoCount",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the message and punishment tools"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isVerified": {
"type": "boolean",
"description": "Whether the creator has passed platform verification"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"ugcVerified": {
"type": "boolean",
"description": "Whether the creator is UGC-verified"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok median views, or null"
},
"instagramMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram median views, or null"
},
"tiktokLastPeriodVideoCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos posted in the last period, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator behind the referral, or null when they have no influencer profile"
},
"ambassadorId": {
"type": "number",
"description": "The referral's id — the ambassadorId for accept/reject/remove"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The accepted ambassador, or null on a preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Add a customer-success note against an agency account — the append-only notes the success team keeps, attributed to the signed-in staff member. Applies directly, exactly as the web app's note box does (it is internal and one-click, with no confirmation). Resolve an agency name with list-customer-success-agencies (search) or list-agencies first, and read the existing notes with list-customer-success-notes. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The agency's id, from list-customer-success-agencies or list-agencies
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"authorName",
"createdAt",
"id",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The note's id"
},
"text": {
"type": "string",
"description": "The note body"
},
"createdAt": {
"type": "string",
"description": "When the note was written (ISO 8601)"
},
"authorName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The staff member who wrote the note, or null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "add-customer-success-note",
"title": "Add a customer success note",
"description": "Add a customer-success note against an agency account — the append-only notes the success team keeps, attributed to the signed-in staff member. Applies directly, exactly as the web app's note box does (it is internal and one-click, with no confirmation). Resolve an agency name with list-customer-success-agencies (search) or list-agencies first, and read the existing notes with list-customer-success-notes. Admin-only and global — the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The note body to add"
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The agency's id, from list-customer-success-agencies or list-agencies"
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"authorName",
"createdAt",
"id",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The note's id"
},
"text": {
"type": "string",
"description": "The note body"
},
"createdAt": {
"type": "string",
"description": "When the note was written (ISO 8601)"
},
"authorName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The staff member who wrote the note, or null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Add one or more creators to an influencer group (from list-groups) by their influencer profile uuid. When you only know a creator by name or handle, first resolve them to a uuid with search-influencer-network — and if more than one creator matches, list the matches and ask which is meant before adding, never guess. Each creator is added independently, so the result reports which succeeded and which the platform refused — a blocked creator (influencer_is_blocked) or a deleted one (influencer_unavailable). Applies directly, as the web app does. Only a brand or agency member with write access may add; the platform refuses otherwise.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
groupId
The id of the group to add creators to, from list-groups.
Clear enough to supply this argument.
influencerIds
The influencer profile ids to add — from search-influencer-network, list-group-influencers, or list-group-similar-influencers, NOT the BaseUser userId.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"added",
"failed",
"groupId"
],
"properties": {
"added": {
"type": "array",
"items": {
"type": "number"
},
"description": "The influencer profile ids (uuids) successfully added to the group"
},
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"influencerId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why"
},
"influencerId": {
"type": "number",
"description": "The uuid that failed"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be added — e.g. blocked (influencer_is_blocked) or unavailable"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "add-influencers-to-group",
"title": "Add creators to an influencer group",
"description": "Add one or more creators to an influencer group (from list-groups) by their influencer profile uuid. When you only know a creator by name or handle, first resolve them to a uuid with search-influencer-network — and if more than one creator matches, list the matches and ask which is meant before adding, never guess. Each creator is added independently, so the result reports which succeeded and which the platform refused — a blocked creator (influencer_is_blocked) or a deleted one (influencer_unavailable). Applies directly, as the web app does. Only a brand or agency member with write access may add; the platform refuses otherwise.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId",
"influencerIds"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to add creators to, from list-groups."
},
"influencerIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"minItems": 1,
"description": "The influencer profile ids to add — from search-influencer-network, list-group-influencers, or list-group-similar-influencers, NOT the BaseUser userId."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"added",
"failed",
"groupId"
],
"properties": {
"added": {
"type": "array",
"items": {
"type": "number"
},
"description": "The influencer profile ids (uuids) successfully added to the group"
},
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"influencerId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why"
},
"influencerId": {
"type": "number",
"description": "The uuid that failed"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be added — e.g. blocked (influencer_is_blocked) or unavailable"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Search new keywords and merge them into an existing, completed TikTok-visibility report, re-scoring the brand and its competitors across the fuller keyword set. The report must already be complete (the tool refuses one still running), and keywords already present are skipped — if all are, the tool says so. The new keywords are searched and merged server-side over about a minute. The call returns right away and never blocks. Where the client renders a live report panel, the panel shows the current scores and fills in the new keywords on its own once they land; otherwise retrieve the re-scored report with get-tiktok-visibility-report (passing the new keywords as awaitKeywords) — that call waits for the merge and tells you to call it again if the keywords have not landed yet, so repeat until it returns the report. Either way, do not schedule a background task or re-prompt. Present the scores and breakdowns as charts. Names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
keywords
The new keywords to search and merge into the report. Keywords already in the report are skipped.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
reportId
The report to add keywords to — the report_id from create-tiktok-visibility-report or get-tiktok-visibility-report. It must already be complete.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "add-tiktok-keywords",
"title": "Add keywords to a TikTok visibility report",
"description": "Search new keywords and merge them into an existing, completed TikTok-visibility report, re-scoring the brand and its competitors across the fuller keyword set. The report must already be complete (the tool refuses one still running), and keywords already present are skipped — if all are, the tool says so. The new keywords are searched and merged server-side over about a minute. The call returns right away and never blocks. Where the client renders a live report panel, the panel shows the current scores and fills in the new keywords on its own once they land; otherwise retrieve the re-scored report with get-tiktok-visibility-report (passing the new keywords as awaitKeywords) — that call waits for the merge and tells you to call it again if the keywords have not landed yet, so repeat until it returns the report. Either way, do not schedule a background task or re-prompt. Present the scores and breakdowns as charts. Names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"keywords",
"reportId"
],
"properties": {
"keywords": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The new keywords to search and merge into the report. Keywords already in the report are skipped."
},
"reportId": {
"type": "string",
"minLength": 1,
"description": "The report to add keywords to — the report_id from create-tiktok-visibility-report or get-tiktok-visibility-report. It must already be complete."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Add a video brief to a UGC campaign, optionally setting its length, name and scene instructions (hook, key messages, call to action). Target it by campaignId; no brand needs to be selected. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to add it. Adding a video raises the campaign's cash reward, which the platform recomputes. Only a UGC campaign accepts videos; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
callToAction
Instruction for the call-to-action scene — what viewers should be prompted to do (buy, use a code, awareness); omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
hook
Instruction for the hook scene — the video's opening line, to grab viewers immediately; omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
keyMessages
Instruction for the key-messages scene — what the creator must mention (USPs, specific points); omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
campaignId
The id of the UGC campaign to add a video to, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
length
The video's length in seconds. Defaults to 30 when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The video's name. Defaults to "Video N".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"video"
],
"properties": {
"video": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The added video once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the video was actually added (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "add-ugc-video",
"title": "Add a video to a UGC campaign",
"description": "Add a video brief to a UGC campaign, optionally setting its length, name and scene instructions (hook, key messages, call to action). Target it by campaignId; no brand needs to be selected. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to add it. Adding a video raises the campaign's cash reward, which the platform recomputes. Only a UGC campaign accepts videos; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"hook": {
"type": "string",
"description": "Instruction for the hook scene — the video's opening line, to grab viewers immediately; omit to leave this scene's current text unchanged."
},
"name": {
"type": "string",
"description": "The video's name. Defaults to \"Video N\"."
},
"length": {
"anyOf": [
{
"type": "number",
"const": 15
},
{
"type": "number",
"const": 30
}
],
"description": "The video's length in seconds. Defaults to 30 when omitted."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC campaign to add a video to, from list-campaigns, search-campaigns or get-campaign."
},
"keyMessages": {
"type": "string",
"description": "Instruction for the key-messages scene — what the creator must mention (USPs, specific points); omit to leave this scene's current text unchanged."
},
"callToAction": {
"type": "string",
"description": "Instruction for the call-to-action scene — what viewers should be prompted to do (buy, use a code, awareness); omit to leave this scene's current text unchanged."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"video"
],
"properties": {
"video": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The added video once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the video was actually added (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Add to or deduct from a brand's credit balance by an amount — the credit-specific path, where edit-agency only sets the field raw. Address by brandId (the usual way) or agencyId. The balance lives on the agency that owns the brand: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. The platform records every change as a paid adjustment invoice (an audit trail), so this is preview-then-confirm: with confirm false (the default) it previews the current balance, the delta, and the resulting balance, naming what was asked about; set confirm true to apply. Admin-only platform-side — a non-admin is refused (only_admin_can_update_credits), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Give this OR brandId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
amount
The number of credits to add to the balance (negative to deduct). The resulting balance is the current one plus this.
Clear enough to supply this argument.
brandId
The id of the brand whose credit balance to adjust, from list-brands. Give this OR agencyId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applied",
"delta",
"previousBalance",
"resultingBalance"
],
"properties": {
"delta": {
"type": "number",
"description": "The amount added to (or, if negative, deducted from) the balance"
},
"applied": {
"type": "boolean",
"description": "Whether the adjustment was applied (false for a preview)"
},
"previousBalance": {
"type": "number",
"description": "The balance before the adjustment"
},
"resultingBalance": {
"type": "number",
"description": "The balance after the adjustment (projected in a preview)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "adjust-agency-credits",
"title": "Adjust a credit balance",
"description": "Add to or deduct from a brand's credit balance by an amount — the credit-specific path, where edit-agency only sets the field raw. Address by brandId (the usual way) or agencyId. The balance lives on the agency that owns the brand: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. The platform records every change as a paid adjustment invoice (an audit trail), so this is preview-then-confirm: with confirm false (the default) it previews the current balance, the delta, and the resulting balance, naming what was asked about; set confirm true to apply. Admin-only platform-side — a non-admin is refused (only_admin_can_update_credits), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"amount"
],
"properties": {
"amount": {
"type": "number",
"description": "The number of credits to add to the balance (negative to deduct). The resulting balance is the current one plus this."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose credit balance to adjust, from list-brands. Give this OR agencyId."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applied",
"delta",
"previousBalance",
"resultingBalance"
],
"properties": {
"delta": {
"type": "number",
"description": "The amount added to (or, if negative, deducted from) the balance"
},
"applied": {
"type": "boolean",
"description": "Whether the adjustment was applied (false for a preview)"
},
"previousBalance": {
"type": "number",
"description": "The balance before the adjustment"
},
"resultingBalance": {
"type": "number",
"description": "The balance after the adjustment (projected in a preview)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Assign voucher codes and personal links to creators
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Assign voucher codes (individual discount codes) and/or personal links (link stickers) to a campaign's accepted creators in one step, from a list of {applicationId, voucherCode, personalLink}. The platform never overwrites a code a creator already has and reports what it assigned, skipped and could not find. This mirrors the web's CSV upload, so it applies directly. The campaign must support the code type (campaign_does_not_support_csv_upload is surfaced as-is). Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
assignments › items › applicationId
The application to assign to, from list-preparation.
Clear enough to supply this argument.
assignments › items › personalLink
A personal link (link sticker) for this creator, if any.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
assignments › items › voucherCode
A voucher code (individual discount code) for this creator, if any.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
campaignId
The id of the campaign whose creators to assign codes to.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"links",
"notFound",
"performed",
"requested",
"vouchers"
],
"properties": {
"links": {
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no code to assign"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a code — never overwritten"
}
},
"description": "How the personal links were applied",
"additionalProperties": false
},
"notFound": {
"type": "array",
"items": {
"type": "number"
},
"description": "Application ids that were not accepted creators on this campaign"
},
"vouchers": {
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no code to assign"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a code — never overwritten"
}
},
"description": "How the voucher codes were applied",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the assignment ran — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many creator rows the request asked to assign"
},
"campaignId": {
"type": "number",
"description": "The campaign codes were assigned on"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "assign-codes",
"title": "Assign voucher codes and personal links to creators",
"description": "Assign voucher codes (individual discount codes) and/or personal links (link stickers) to a campaign's accepted creators in one step, from a list of {applicationId, voucherCode, personalLink}. The platform never overwrites a code a creator already has and reports what it assigned, skipped and could not find. This mirrors the web's CSV upload, so it applies directly. The campaign must support the code type (campaign_does_not_support_csv_upload is surfaced as-is). Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"assignments",
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose creators to assign codes to."
},
"assignments": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId"
],
"properties": {
"voucherCode": {
"type": "string",
"description": "A voucher code (individual discount code) for this creator, if any."
},
"personalLink": {
"type": "string",
"description": "A personal link (link sticker) for this creator, if any."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The application to assign to, from list-preparation."
}
}
},
"minItems": 1,
"description": "The creators to assign codes to, each with a voucher code and/or a personal link."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"links",
"notFound",
"performed",
"requested",
"vouchers"
],
"properties": {
"links": {
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no code to assign"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a code — never overwritten"
}
},
"description": "How the personal links were applied",
"additionalProperties": false
},
"notFound": {
"type": "array",
"items": {
"type": "number"
},
"description": "Application ids that were not accepted creators on this campaign"
},
"vouchers": {
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no code to assign"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a code — never overwritten"
}
},
"description": "How the voucher codes were applied",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the assignment ran — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many creator rows the request asked to assign"
},
"campaignId": {
"type": "number",
"description": "The campaign codes were assigned on"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Assign a subscription to an agency directly, bypassing payment (admin-assigned) — the company/agency-edit path. Pass a packageId (from list-plans) to assign a catalog plan, snapshotting its fields and applying only the override fields you give; or omit packageId to define a custom ENTERPRISE plan from the fields you pass. Agency- scoped (agencyId + agencyName). Applies directly, as the web app's plan admin does. The platform refuses if the agency already has an active or planned subscription (active_subscription_already_exists, planned_subscription_already_exists) — surfaced as-is. Fine-tune afterwards with edit-subscription. When reporting the result to the user, speak in terms of whatever they named (the brand, usually) — that a plan is stored at the agency level is internal plumbing, not something to explain to them.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Explain what happens when this optional value is omitted.
accessToInfluencerNetwork
ENTERPRISE: grant access to the influencer network.
Explain what happens when this optional value is omitted.
agencyId
The id of the agency to assign the subscription to, from list-agencies.
Clear enough to supply this argument.
agencyName
The agency's name, from list-agencies, used to name it in the result.
Clear enough to supply this argument.
aiAutoApprove
Whether the AI auto-approves content.
Explain the meaning of this value, not just its name.
buyout
The buyout allowance (null-equivalent unlimited not settable here).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignBooster
Whether the campaign booster feature is on.
Clear enough to supply this argument.
contentApproval
Whether content approval is on.
Clear enough to supply this argument.
currency
The account currency, e.g. CHF. Defaults to the plan's/agency's currency.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
discount
A discount amount applied to the price.
Clear enough to supply this argument.
extraCampaignPrice
ENTERPRISE: price per extra campaign.
Clear enough to supply this argument.
extraSeatPrice
ENTERPRISE: price per extra seat.
Clear enough to supply this argument.
influencerLevelInsights
Whether influencer-level insights are on.
Clear enough to supply this argument.
influencersPerCampaign
Influencers allowed per campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagramCampaigns
Whether Instagram campaigns are allowed.
Clear enough to supply this argument.
invitationsPerCampaign
Invitations allowed per campaign.
Clear enough to supply this argument.
multipleActiveCampaigns
Whether multiple active campaigns are allowed.
Clear enough to supply this argument.
multipleBrands
ENTERPRISE: whether the agency may hold multiple brands.
Clear enough to supply this argument.
numberOfCampaigns
ENTERPRISE: campaigns included (omit for unlimited).
Clear enough to supply this argument.
numberOfSeats
ENTERPRISE: sub-brand seats included.
Clear enough to supply this argument.
otherCountries
Whether targeting beyond the default region is allowed.
Clear enough to supply this argument.
packageId
The catalog plan to assign, from list-plans. Its fields are snapshotted onto the subscription; only the override fields here adjust it. Omit to define a custom ENTERPRISE plan from the fields you pass instead.
Clear enough to supply this argument.
packageType
The billing period. QUARTERLY, HALF_YEARLY and THREE_PLUS_TWELVE are admin-only.
Clear enough to supply this argument.
personalAccountManager
ENTERPRISE: whether a personal account manager is included.
Clear enough to supply this argument.
pricePaid
The price actually paid (overrides the derived price).
Clear enough to supply this argument.
pricePerMonth
ENTERPRISE: the monthly price.
Clear enough to supply this argument.
pricePerYear
The yearly price.
Clear enough to supply this argument.
proCreatorMode
Whether pro-creator mode is on.
Clear enough to supply this argument.
recurring
Whether the subscription renews automatically.
Clear enough to supply this argument.
socialFeedFilters
Whether social-feed filters are on.
Clear enough to supply this argument.
templateName
ENTERPRISE: save this custom plan as a reusable template under this name.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"subscription"
],
"properties": {
"agency": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The subscription that was assigned, or null when the call was refused before assigning (e.g. an ambiguous agency)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "assign-subscription",
"title": "Assign a subscription to an agency",
"description": "Assign a subscription to an agency directly, bypassing payment (admin-assigned) — the company/agency-edit path. Pass a packageId (from list-plans) to assign a catalog plan, snapshotting its fields and applying only the override fields you give; or omit packageId to define a custom ENTERPRISE plan from the fields you pass. Agency- scoped (agencyId + agencyName). Applies directly, as the web app's plan admin does. The platform refuses if the agency already has an active or planned subscription (active_subscription_already_exists, planned_subscription_already_exists) — surfaced as-is. Fine-tune afterwards with edit-subscription. When reporting the result to the user, speak in terms of whatever they named (the brand, usually) — that a plan is stored at the agency level is internal plumbing, not something to explain to them.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"agencyName",
"packageType"
],
"properties": {
"buyout": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The buyout allowance (null-equivalent unlimited not settable here)."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to assign the subscription to, from list-agencies."
},
"currency": {
"type": "string",
"description": "The account currency, e.g. CHF. Defaults to the plan's/agency's currency."
},
"discount": {
"type": "number",
"minimum": 0,
"description": "A discount amount applied to the price."
},
"packageId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The catalog plan to assign, from list-plans. Its fields are snapshotted onto the subscription; only the override fields here adjust it. Omit to define a custom ENTERPRISE plan from the fields you pass instead."
},
"pricePaid": {
"type": "number",
"minimum": 0,
"description": "The price actually paid (overrides the derived price)."
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically."
},
"validFrom": {
"type": "string",
"description": "When the subscription becomes valid (ISO 8601)."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, used to name it in the result."
},
"validUntil": {
"type": "string",
"description": "When the subscription is valid until (ISO 8601)."
},
"packageType": {
"enum": [
"HALF_YEARLY",
"MONTHLY",
"QUARTERLY",
"THREE_PLUS_TWELVE",
"YEARLY"
],
"type": "string",
"description": "The billing period. QUARTERLY, HALF_YEARLY and THREE_PLUS_TWELVE are admin-only."
},
"pricePerYear": {
"type": "number",
"minimum": 0,
"description": "The yearly price."
},
"templateName": {
"type": "string",
"description": "ENTERPRISE: save this custom plan as a reusable template under this name."
},
"tiktokSearch": {
"type": "boolean",
"description": "Whether TikTok search/visibility is on."
},
"aiAutoApprove": {
"type": "boolean",
"description": "Whether the AI auto-approves content."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"numberOfSeats": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "ENTERPRISE: sub-brand seats included."
},
"pricePerMonth": {
"type": "number",
"minimum": 0,
"description": "ENTERPRISE: the monthly price."
},
"extraSeatPrice": {
"type": "number",
"minimum": 0,
"description": "ENTERPRISE: price per extra seat."
},
"multipleBrands": {
"type": "boolean",
"description": "ENTERPRISE: whether the agency may hold multiple brands."
},
"otherCountries": {
"type": "boolean",
"description": "Whether targeting beyond the default region is allowed."
},
"proCreatorMode": {
"type": "boolean",
"description": "Whether pro-creator mode is on."
},
"campaignBooster": {
"type": "boolean",
"description": "Whether the campaign booster feature is on."
},
"contentApproval": {
"type": "boolean",
"description": "Whether content approval is on."
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether TikTok campaigns are allowed."
},
"numberOfCampaigns": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "ENTERPRISE: campaigns included (omit for unlimited)."
},
"socialFeedFilters": {
"type": "boolean",
"description": "Whether social-feed filters are on."
},
"extraCampaignPrice": {
"type": "number",
"minimum": 0,
"description": "ENTERPRISE: price per extra campaign."
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether Instagram campaigns are allowed."
},
"influencersPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Influencers allowed per campaign."
},
"invitationsPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Invitations allowed per campaign."
},
"personalAccountManager": {
"type": "boolean",
"description": "ENTERPRISE: whether a personal account manager is included."
},
"influencerLevelInsights": {
"type": "boolean",
"description": "Whether influencer-level insights are on."
},
"multipleActiveCampaigns": {
"type": "boolean",
"description": "Whether multiple active campaigns are allowed."
},
"accessToInfluencerNetwork": {
"type": "boolean",
"description": "ENTERPRISE: grant access to the influencer network."
},
"tiktokVisibilityKeywordLimit": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "TikTok visibility keyword limit."
},
"tiktokVisibilitySyncIntervalHours": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "TikTok visibility sync interval, in hours."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"subscription"
],
"properties": {
"agency": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The subscription that was assigned, or null when the call was refused before assigning (e.g. an ambiguous agency)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Send a single voucher (discount) code to one creator on a voucher campaign. This mirrors the web's inline voucher-send, so it applies directly. To assign codes to many creators at once, or to assign personal links, use assign-codes instead. Target it by applicationId (from list-preparation); no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application to assign the voucher to, from list-preparation.
Clear enough to supply this argument.
voucher
The voucher (discount) code to send to the creator.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"voucher"
],
"properties": {
"voucher": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The voucher code now on the application, or null"
},
"performed": {
"type": "boolean",
"description": "Whether the voucher was assigned — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application the voucher was assigned to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "assign-voucher",
"title": "Assign a voucher code to a creator",
"description": "Send a single voucher (discount) code to one creator on a voucher campaign. This mirrors the web's inline voucher-send, so it applies directly. To assign codes to many creators at once, or to assign personal links, use assign-codes instead. Target it by applicationId (from list-preparation); no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"voucher"
],
"properties": {
"voucher": {
"type": "string",
"minLength": 1,
"description": "The voucher (discount) code to send to the creator."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application to assign the voucher to, from list-preparation."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"voucher"
],
"properties": {
"voucher": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The voucher code now on the application, or null"
},
"performed": {
"type": "boolean",
"description": "Whether the voucher was assigned — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application the voucher was assigned to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Mark a creator's spark/partnership ad code as boosted (used) and get the code plus the deep link to the external ad manager to paste it into. This mirrors the web's one-click Boost: it stamps the code as copied so the campaign can track which content has been boosted. The platform has no direct push to TikTok/Meta, so actually pasting the code into the ad manager is a manual step. Find the mediaId with list-ad-codes; if the media has no code yet, set one first with set-ad-code. No brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
mediaId
The id of the synced media to boost, from list-ad-codes (mediaId) or list-reporting-submissions.
Clear enough to supply this argument.
platform
Where the content lives — instagram for a Partnership ad, tiktok for a Spark ad.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adsManagerUrl",
"lastCopiedAt",
"mediaId",
"permalink",
"platform",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the code has now been boosted/copied at least once"
},
"mediaId": {
"type": "number",
"description": "The media that was marked boosted"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code to paste, or null if none is set"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the code was marked boosted (now), or null"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the external ad manager where the code is pasted to boost"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "boost-content",
"title": "Mark an ad code boosted",
"description": "Mark a creator's spark/partnership ad code as boosted (used) and get the code plus the deep link to the external ad manager to paste it into. This mirrors the web's one-click Boost: it stamps the code as copied so the campaign can track which content has been boosted. The platform has no direct push to TikTok/Meta, so actually pasting the code into the ad manager is a manual step. Find the mediaId with list-ad-codes; if the media has no code yet, set one first with set-ad-code. No brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"platform"
],
"properties": {
"mediaId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the synced media to boost, from list-ad-codes (mediaId) or list-reporting-submissions."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Where the content lives — instagram for a Partnership ad, tiktok for a Spark ad."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adsManagerUrl",
"lastCopiedAt",
"mediaId",
"permalink",
"platform",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the code has now been boosted/copied at least once"
},
"mediaId": {
"type": "number",
"description": "The media that was marked boosted"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code to paste, or null if none is set"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the code was marked boosted (now), or null"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the external ad manager where the code is pasted to boost"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Browse campaigns across every brand by property, the way the platform's campaign list page does. Filter by channel, campaign or brand name, target country, creator niche, reward type, bonus pool, format (event, ongoing or time-limited), visibility, whether it recruits pro creators, and lifecycle phase — visibility and phase are admin-only, and the platform scopes what each caller may see. Returns the matching campaigns with a per-channel count of the wider match. Global — no brand needs to be selected. To list one brand's own dashboard by status use list-campaigns, or to jump to a campaign by name use search-campaigns. Results come back in the same order the platform's campaign list page uses; present them in that order and do not re-sort them.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bonusPool
Keep only campaigns that do (true) or do not (false) offer a bonus pool.
Clear enough to supply this argument.
brandName
Narrow to campaigns whose brand or company name contains this text.
Clear enough to supply this argument.
campaignName
Narrow to campaigns whose title contains this text.
Clear enough to supply this argument.
channel
Whether to list campaigns from every channel together or restrict to a single channel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country
Keep only campaigns targeting this country. Recognized: Switzerland, Germany, Austria, United States, United Kingdom (common local names and abbreviations like Deutschland, Schweiz, USA and UK are accepted). A value that matches none of these is reported back in unmatchedCountry and no country filter is applied.
Clear enough to supply this argument.
format
Keep only campaigns of this format: event (a dated event campaign), ongoing (a rolling campaign), or time_limited (a one-off with a deadline).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
interests
Keep only campaigns aimed at these creator niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back.
Clear enough to supply this argument.
limit
How many campaigns to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return; request the next page while hasMore is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
private
Keep only private (true) or public (false) campaigns. Admin-only; the platform ignores it otherwise.
Clear enough to supply this argument.
pro
When true, keep only campaigns that recruit pro creators.
Clear enough to supply this argument.
reward
Keep only campaigns rewarding with cash or with a product.
Clear enough to supply this argument.
status
Keep only campaigns in this lifecycle phase, named exactly as the platform's web Phase filter labels them — pick the value whose name matches the phase the user says. `reporting` is the web's "Reporting" tab: finished campaigns whose reporting window is open (this is what a user asking for the "reporting phase" means). `gathering_reporting` is the narrower "Gathering Reporting" bucket — non-UGC campaigns completed within the last three weeks whose reports are still being collected. The rest map to their like-named tabs: planned, open, preparation, active, paused. Admin-only; the platform ignores it for other roles.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"channelCounts",
"count",
"hasMore",
"page",
"unmatchedCountry",
"unmatchedInterests"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicants",
"bonusPool",
"brandName",
"cashReward",
"castingStart",
"company",
"completed",
"created",
"deadline",
"event",
"featured",
"id",
"instagram",
"locations",
"onGoing",
"paused",
"pictureUrl",
"proInfluencer",
"rewardType",
"sellingPrice",
"status",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an event campaign"
},
"title": {
"type": "string",
"description": "The campaign's title"
},
"paused": {
"type": "boolean",
"description": "Whether the campaign is currently paused"
},
"status": {
"type": "string",
"description": "The campaign's computed lifecycle phase: draft, planned, open, preparation, active or complete"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"company": {
"type": "object",
"required": [
"id",
"name",
"pictureUrl"
],
"properties": {
"id": {
"type": "number",
"description": "The owning brand's id, passed to select-brand or get-campaign's brand tools"
},
"name": {
"type": "string",
"description": "The owning brand's name"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's logo, or null when none is on file"
}
},
"description": "The brand that owns the campaign",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is an ongoing (rolling) campaign"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"featured": {
"type": "boolean",
"description": "Whether the campaign is featured on the platform"
},
"bonusPool": {
"type": "boolean",
"description": "Whether the campaign offers a bonus pool"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name the campaign runs under, or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null when unset"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram (derived: neither TikTok nor UGC)"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"applicants": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators have applied, or null when the count is not reported"
},
"cashReward": {
"type": "number",
"description": "The cash reward per creator, in the campaign's currency (0 when there is none)"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's cover image, or null when none is set"
},
"rewardType": {
"type": "string",
"description": "The reward type: PRODUCT_CASH, PRODUCT, VOUCHER_CASH, VOUCHER, CASH or OTHER"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency (0 when none)"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether the campaign recruits pro creators"
}
},
"additionalProperties": false
},
"description": "The campaigns on this page of results"
},
"channelCounts": {
"type": "object",
"required": [
"instagram",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC campaigns matching the other filters"
},
"tiktok": {
"type": "number",
"description": "TikTok campaigns matching the other filters"
},
"instagram": {
"type": "number",
"description": "Instagram campaigns matching the other filters"
}
},
"description": "How the matching campaigns break down by channel, ignoring the channel filter itself",
"additionalProperties": false
},
"unmatchedCountry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The given country if it matched no recognized country and was therefore not applied as a filter, else null"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "browse-campaigns",
"title": "Browse campaigns across brands",
"description": "Browse campaigns across every brand by property, the way the platform's campaign list page does. Filter by channel, campaign or brand name, target country, creator niche, reward type, bonus pool, format (event, ongoing or time-limited), visibility, whether it recruits pro creators, and lifecycle phase — visibility and phase are admin-only, and the platform scopes what each caller may see. Returns the matching campaigns with a per-channel count of the wider match. Global — no brand needs to be selected. To list one brand's own dashboard by status use list-campaigns, or to jump to a campaign by name use search-campaigns. Results come back in the same order the platform's campaign list page uses; present them in that order and do not re-sort them.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"pro": {
"type": "boolean",
"description": "When true, keep only campaigns that recruit pro creators."
},
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return; request the next page while hasMore is true."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many campaigns to return per page."
},
"format": {
"enum": [
"event",
"ongoing",
"time_limited"
],
"type": "string",
"description": "Keep only campaigns of this format: event (a dated event campaign), ongoing (a rolling campaign), or time_limited (a one-off with a deadline)."
},
"reward": {
"enum": [
"cash",
"product"
],
"type": "string",
"description": "Keep only campaigns rewarding with cash or with a product."
},
"status": {
"enum": [
"active",
"gathering_reporting",
"open",
"paused",
"planned",
"preparation",
"reporting"
],
"type": "string",
"description": "Keep only campaigns in this lifecycle phase, named exactly as the platform's web Phase filter labels them — pick the value whose name matches the phase the user says. `reporting` is the web's \"Reporting\" tab: finished campaigns whose reporting window is open (this is what a user asking for the \"reporting phase\" means). `gathering_reporting` is the narrower \"Gathering Reporting\" bucket — non-UGC campaigns completed within the last three weeks whose reports are still being collected. The rest map to their like-named tabs: planned, open, preparation, active, paused. Admin-only; the platform ignores it for other roles."
},
"channel": {
"enum": [
"all",
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"default": "all",
"description": "Whether to list campaigns from every channel together or restrict to a single channel."
},
"country": {
"type": "string",
"description": "Keep only campaigns targeting this country. Recognized: Switzerland, Germany, Austria, United States, United Kingdom (common local names and abbreviations like Deutschland, Schweiz, USA and UK are accepted). A value that matches none of these is reported back in unmatchedCountry and no country filter is applied."
},
"private": {
"type": "boolean",
"description": "Keep only private (true) or public (false) campaigns. Admin-only; the platform ignores it otherwise."
},
"bonusPool": {
"type": "boolean",
"description": "Keep only campaigns that do (true) or do not (false) offer a bonus pool."
},
"brandName": {
"type": "string",
"description": "Narrow to campaigns whose brand or company name contains this text."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Keep only campaigns aimed at these creator niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back."
},
"campaignName": {
"type": "string",
"description": "Narrow to campaigns whose title contains this text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"channelCounts",
"count",
"hasMore",
"page",
"unmatchedCountry",
"unmatchedInterests"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicants",
"bonusPool",
"brandName",
"cashReward",
"castingStart",
"company",
"completed",
"created",
"deadline",
"event",
"featured",
"id",
"instagram",
"locations",
"onGoing",
"paused",
"pictureUrl",
"proInfluencer",
"rewardType",
"sellingPrice",
"status",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an event campaign"
},
"title": {
"type": "string",
"description": "The campaign's title"
},
"paused": {
"type": "boolean",
"description": "Whether the campaign is currently paused"
},
"status": {
"type": "string",
"description": "The campaign's computed lifecycle phase: draft, planned, open, preparation, active or complete"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"company": {
"type": "object",
"required": [
"id",
"name",
"pictureUrl"
],
"properties": {
"id": {
"type": "number",
"description": "The owning brand's id, passed to select-brand or get-campaign's brand tools"
},
"name": {
"type": "string",
"description": "The owning brand's name"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's logo, or null when none is on file"
}
},
"description": "The brand that owns the campaign",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is an ongoing (rolling) campaign"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"featured": {
"type": "boolean",
"description": "Whether the campaign is featured on the platform"
},
"bonusPool": {
"type": "boolean",
"description": "Whether the campaign offers a bonus pool"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name the campaign runs under, or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null when unset"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram (derived: neither TikTok nor UGC)"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"applicants": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators have applied, or null when the count is not reported"
},
"cashReward": {
"type": "number",
"description": "The cash reward per creator, in the campaign's currency (0 when there is none)"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's cover image, or null when none is set"
},
"rewardType": {
"type": "string",
"description": "The reward type: PRODUCT_CASH, PRODUCT, VOUCHER_CASH, VOUCHER, CASH or OTHER"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency (0 when none)"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether the campaign recruits pro creators"
}
},
"additionalProperties": false
},
"description": "The campaigns on this page of results"
},
"channelCounts": {
"type": "object",
"required": [
"instagram",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC campaigns matching the other filters"
},
"tiktok": {
"type": "number",
"description": "TikTok campaigns matching the other filters"
},
"instagram": {
"type": "number",
"description": "Instagram campaigns matching the other filters"
}
},
"description": "How the matching campaigns break down by channel, ignoring the channel filter itself",
"additionalProperties": false
},
"unmatchedCountry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The given country if it matched no recognized country and was therefore not applied as a filter, else null"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Assign vouchers, personal link stickers, and community discount codes to a campaign's accepted creators by uploading the filled preparation CSV — the companion to export-preparation-csv. The CSV must have an application_id column plus at least one of voucher_code / individual_link / community_discount_code. Because it applies an opaque file and newly assigned voucher and community codes push-notify those creators, it is preview-then-confirm and names the brand (the per-row breakdown is only known after it runs — there is no dry-run). Give the file as content (inline CSV text — the Claude Desktop route when you have the text), a local path (Claude Code), or a url; if a pasted file on the hosted server has no readable path and you lack the text, mint a request-file-upload link (campaign-codes-csv) instead — never the web app. For a small set of codes you can type out, assign-codes is simpler. The platform refuses a campaign that supports none of the code types (campaign_does_not_support_csv_upload) and a CSV missing required columns (csv_missing_required_columns), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose accepted creators to assign to.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
content
The CSV content inline, as text (the header row plus data rows). Use when you already have it as text.
Clear enough to supply this argument.
path
An absolute path to a local .csv file the server reads directly — the preferred source when the server can see the file (running locally in Claude Code). On the hosted server a pasted or dragged file lives in a sandbox this server cannot read, so its path will fail — mint a request-file-upload link (campaign-codes-csv) there instead.
Clear enough to supply this argument.
url
A public URL the server fetches the .csv from — use when the file is online.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"communityCodes",
"linkStickers",
"notFound",
"performed",
"voucherCodes"
],
"properties": {
"notFound": {
"type": "array",
"items": {
"type": "number"
},
"description": "application_id values in the CSV that were not accepted creators on this campaign (empty on preview)"
},
"performed": {
"type": "boolean",
"description": "Whether the upload was applied (true) or this is a preview only (false)."
},
"campaignId": {
"type": "number",
"description": "The campaign the CSV was applied to"
},
"linkStickers": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the value was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no value in this column"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a value — never overwritten"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How personal link stickers applied, or null on preview"
},
"voucherCodes": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the value was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no value in this column"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a value — never overwritten"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How voucher codes applied, or null on preview"
},
"communityCodes": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"changed",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"changed": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose existing community code was changed to a new one"
},
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the community code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no community code"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had this exact community code"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How community discount codes applied, or null on preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "bulk-upload-applications-csv",
"title": "Bulk-assign codes from a CSV",
"description": "Assign vouchers, personal link stickers, and community discount codes to a campaign's accepted creators by uploading the filled preparation CSV — the companion to export-preparation-csv. The CSV must have an application_id column plus at least one of voucher_code / individual_link / community_discount_code. Because it applies an opaque file and newly assigned voucher and community codes push-notify those creators, it is preview-then-confirm and names the brand (the per-row breakdown is only known after it runs — there is no dry-run). Give the file as content (inline CSV text — the Claude Desktop route when you have the text), a local path (Claude Code), or a url; if a pasted file on the hosted server has no readable path and you lack the text, mint a request-file-upload link (campaign-codes-csv) instead — never the web app. For a small set of codes you can type out, assign-codes is simpler. The platform refuses a campaign that supports none of the code types (campaign_does_not_support_csv_upload) and a CSV missing required columns (csv_missing_required_columns), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the .csv from — use when the file is online."
},
"path": {
"type": "string",
"description": "An absolute path to a local .csv file the server reads directly — the preferred source when the server can see the file (running locally in Claude Code). On the hosted server a pasted or dragged file lives in a sandbox this server cannot read, so its path will fail — mint a request-file-upload link (campaign-codes-csv) there instead."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"content": {
"type": "string",
"description": "The CSV content inline, as text (the header row plus data rows). Use when you already have it as text."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose accepted creators to assign to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"communityCodes",
"linkStickers",
"notFound",
"performed",
"voucherCodes"
],
"properties": {
"notFound": {
"type": "array",
"items": {
"type": "number"
},
"description": "application_id values in the CSV that were not accepted creators on this campaign (empty on preview)"
},
"performed": {
"type": "boolean",
"description": "Whether the upload was applied (true) or this is a preview only (false)."
},
"campaignId": {
"type": "number",
"description": "The campaign the CSV was applied to"
},
"linkStickers": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the value was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no value in this column"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a value — never overwritten"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How personal link stickers applied, or null on preview"
},
"voucherCodes": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the value was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no value in this column"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had a value — never overwritten"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How voucher codes applied, or null on preview"
},
"communityCodes": {
"anyOf": [
{
"type": "object",
"required": [
"assigned",
"changed",
"skippedAlreadyAssigned",
"skippedEmpty"
],
"properties": {
"changed": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose existing community code was changed to a new one"
},
"assigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications the community code was newly assigned to"
},
"skippedEmpty": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications whose row had no community code"
},
"skippedAlreadyAssigned": {
"type": "array",
"items": {
"type": "number"
},
"description": "Applications that already had this exact community code"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "How community discount codes applied, or null on preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Align the title with the capability actually described by this tool.
Description96/100
Cancel an accepted creator's participation during the preparation phase — an outward-facing, refund-bearing change, so it is preview-then-confirm with a required reason and the preview names the brand. The platform only allows this while the application is in preparation and, for non-staff, only before the product is received; its refusals (application_is_not_in_preparation, product_already_received) are surfaced as-is. Target it by applicationId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the accepted application to cancel, from list-preparation or list-applications.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
reason
The reason for removing this creator, shown to the creator.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the cancellation was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application that was cancelled"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "cancel-application",
"title": "Remove a creator from a campaign",
"description": "Cancel an accepted creator's participation during the preparation phase — an outward-facing, refund-bearing change, so it is preview-then-confirm with a required reason and the preview names the brand. The platform only allows this while the application is in preparation and, for non-staff, only before the product is received; its refusals (application_is_not_in_preparation, product_already_received) are surfaced as-is. Target it by applicationId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"minLength": 1,
"description": "The reason for removing this creator, shown to the creator."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the accepted application to cancel, from list-preparation or list-applications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the cancellation was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application that was cancelled"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Cancel an agency's active subscription. Omit agencyId to cancel your own agency's plan (a brand user); pass agencyId to cancel another agency's plan as an admin. A reason is optional (the platform does not require one), and it is preview-then-confirm: with confirm false it states whether access ends now or at the period end and does nothing. With cancelNow the plan ends immediately; otherwise it stops renewing and access continues to the period end. In one monthly-plan edge the platform returns a Stripe link to settle outstanding extra-buyout charges first — pay it, then cancel again. Refusals (no_active_subscription, permission_denied) are surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of an agency whose subscription to cancel — admin only. Omit to cancel your own agency's subscription (a brand user).
Clear enough to supply this argument.
cancelNow
Whether to cancel immediately (access ends now). When false, it cancels at the end of the billing period.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
reason
An optional reason to record with the cancellation. The platform does not require one.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cancelled",
"checkoutUrl",
"performed",
"preview"
],
"properties": {
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen, to state back to the user; else null."
},
"cancelled": {
"type": "boolean",
"description": "Whether the subscription was cancelled."
},
"performed": {
"type": "boolean",
"description": "Whether the cancellation was attempted (true) or this is a preview only (false)."
},
"checkoutUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe link to settle outstanding extra-buyout charges before cancelling (a monthly-plan edge), or null."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "cancel-subscription",
"title": "Cancel a subscription",
"description": "Cancel an agency's active subscription. Omit agencyId to cancel your own agency's plan (a brand user); pass agencyId to cancel another agency's plan as an admin. A reason is optional (the platform does not require one), and it is preview-then-confirm: with confirm false it states whether access ends now or at the period end and does nothing. With cancelNow the plan ends immediately; otherwise it stops renewing and access continues to the period end. In one monthly-plan edge the platform returns a Stripe link to settle outstanding extra-buyout charges first — pay it, then cancel again. Refusals (no_active_subscription, permission_denied) are surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"reason": {
"type": "string",
"description": "An optional reason to record with the cancellation. The platform does not require one."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency whose subscription to cancel — admin only. Omit to cancel your own agency's subscription (a brand user)."
},
"cancelNow": {
"type": "boolean",
"default": false,
"description": "Whether to cancel immediately (access ends now). When false, it cancels at the end of the billing period."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cancelled",
"checkoutUrl",
"performed",
"preview"
],
"properties": {
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen, to state back to the user; else null."
},
"cancelled": {
"type": "boolean",
"description": "Whether the subscription was cancelled."
},
"performed": {
"type": "boolean",
"description": "Whether the cancellation was attempted (true) or this is a preview only (false)."
},
"checkoutUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe link to settle outstanding extra-buyout charges before cancelling (a monthly-plan edge), or null."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Change a user's email address by their user id — the staff change-email action. It sends a verification link to the new address, so it is outward-facing and preview-then-confirm: called with confirm false (the default) it previews the change, naming the user and their current email; set confirm true to apply. The platform refuses changing an already-confirmed email (cannot_update_confirmed_email) and a duplicate (surfaced as an in-use message). Allowed for the user themselves or an admin, decided platform-side.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
email
The new email address to set on the account.
Clear enough to supply this argument.
userId
The user id (BaseUser id) whose email to change, e.g. from list-brand-members.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"changed",
"email",
"userId"
],
"properties": {
"email": {
"type": "string",
"description": "The new email address"
},
"userId": {
"type": "number",
"description": "The user whose email was targeted"
},
"changed": {
"type": "boolean",
"description": "Whether the email was changed (false for a preview)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "change-user-email",
"title": "Change a user's email",
"description": "Change a user's email address by their user id — the staff change-email action. It sends a verification link to the new address, so it is outward-facing and preview-then-confirm: called with confirm false (the default) it previews the change, naming the user and their current email; set confirm true to apply. The platform refuses changing an already-confirmed email (cannot_update_confirmed_email) and a duplicate (surfaced as an in-use message). Allowed for the user themselves or an admin, decided platform-side.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"email",
"userId"
],
"properties": {
"email": {
"type": "string",
"description": "The new email address to set on the account."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The user id (BaseUser id) whose email to change, e.g. from list-brand-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"changed",
"email",
"userId"
],
"properties": {
"email": {
"type": "string",
"description": "The new email address"
},
"userId": {
"type": "number",
"description": "The user whose email was targeted"
},
"changed": {
"type": "boolean",
"description": "Whether the email was changed (false for a preview)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Check whether an account already exists for an email address — the staff email lookup. Returns only whether it exists, no account details. Useful before creating a brand or inviting a member, to avoid a duplicate. A read.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Input documentation gives an agent enough context to populate the arguments.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Combine existing standalone brands into one agency with sub-brands. The FIRST brand's agency survives (and is renamed to that brand's name); every other brand's agency is absorbed into it and then DELETED — irreversible, so it is preview-then-confirm. Pass a single brand to just re-apply the plan config to its agency. The surviving plan's limits, and the agency's emails and large-brand flag, are taken from the surviving agency's current values unless you override them here (matching the web app's pre-filled merge form). The owner email must belong to a member of one of the brands. Admin-only, and every involved subscription must be admin-assigned — the platform refuses otherwise (owner_not_member_of_any_brand_passed, subscription_not_admin_assigned), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandIds
The ids of the brands to combine (from list-brands). The FIRST brand's agency survives and is renamed to that brand's name; every other brand's agency is absorbed into it and deleted. Pass one brand to just re-apply the plan config to its agency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
buyout
Override the surviving plan's buyout allowance.
Explain what happens when this optional value is omitted.
cashRewardServiceFeePercentage
Set the agency's cash-reward service fee percentage.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
credits
Set the agency's credit balance. When omitted, the platform sums the merged agencies' credits.
Clear enough to supply this argument.
currency
The account currency. Required when the surviving agency has no plan yet.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
extraCampaignPrice
Override the price per extra campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
extraSeatPrice
Override the price per extra seat.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencersPerCampaign
Override influencers allowed per campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagramCampaigns
Whether Instagram campaigns are allowed. Only used when creating the surviving plan from scratch.
Clear enough to supply this argument.
invitationsPerCampaign
Override invitations allowed per campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
largeBrand
Override whether the surviving agency is a large-brand agency.
Clear enough to supply this argument.
numberOfCampaigns
Override campaigns included in the plan (omit keeps current).
Clear enough to supply this argument.
numberOfSeats
Override sub-brand seats included in the plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerEmail
The owner's email. It must belong to a member of one of the brands, or the platform refuses.
Clear enough to supply this argument.
packageType
The billing period. Required when the surviving agency has no plan yet.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pricePerMonth
The monthly price. Used when creating the surviving plan from scratch.
Clear enough to supply this argument.
pricePerYear
The yearly price. Used when creating the surviving plan from scratch.
Clear enough to supply this argument.
proServiceFeePercentage
Set the agency's pro-creator service fee percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
relationshipManagerEmail
Override the agency's relationship-manager email.
Clear enough to supply this argument.
salesEmail
Override the agency's sales email.
Clear enough to supply this argument.
tiktokCampaigns
Whether TikTok campaigns are allowed. Only used when creating the surviving plan from scratch.
Clear enough to supply this argument.
validFrom
Set the plan's validity start (ISO 8601). Both from and until, or neither.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
validUntil
Set the plan's validity end (ISO 8601). Both from and until, or neither.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mergedBrandIds",
"performed",
"survivingAgency"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the merge was applied (true) or this is a preview only (false)."
},
"mergedBrandIds": {
"type": "array",
"items": {
"type": "number"
},
"description": "The brand ids that were (or would be) combined"
},
"survivingAgency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The surviving agency's id"
},
"name": {
"type": "string",
"description": "The surviving agency's name (after the merge, the first brand's name)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency the brands merge into, or null when the first brand has no agency"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "combine-brands-into-agency",
"title": "Combine brands into an agency",
"description": "Combine existing standalone brands into one agency with sub-brands. The FIRST brand's agency survives (and is renamed to that brand's name); every other brand's agency is absorbed into it and then DELETED — irreversible, so it is preview-then-confirm. Pass a single brand to just re-apply the plan config to its agency. The surviving plan's limits, and the agency's emails and large-brand flag, are taken from the surviving agency's current values unless you override them here (matching the web app's pre-filled merge form). The owner email must belong to a member of one of the brands. Admin-only, and every involved subscription must be admin-assigned — the platform refuses otherwise (owner_not_member_of_any_brand_passed, subscription_not_admin_assigned), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandIds",
"ownerEmail"
],
"properties": {
"buyout": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Override the surviving plan's buyout allowance."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"credits": {
"type": "number",
"minimum": 0,
"description": "Set the agency's credit balance. When omitted, the platform sums the merged agencies' credits."
},
"brandIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"minItems": 1,
"description": "The ids of the brands to combine (from list-brands). The FIRST brand's agency survives and is renamed to that brand's name; every other brand's agency is absorbed into it and deleted. Pass one brand to just re-apply the plan config to its agency."
},
"currency": {
"type": "string",
"description": "The account currency. Required when the surviving agency has no plan yet."
},
"validFrom": {
"type": "string",
"description": "Set the plan's validity start (ISO 8601). Both from and until, or neither."
},
"largeBrand": {
"type": "boolean",
"description": "Override whether the surviving agency is a large-brand agency."
},
"ownerEmail": {
"type": "string",
"minLength": 1,
"description": "The owner's email. It must belong to a member of one of the brands, or the platform refuses."
},
"salesEmail": {
"type": "string",
"description": "Override the agency's sales email."
},
"validUntil": {
"type": "string",
"description": "Set the plan's validity end (ISO 8601). Both from and until, or neither."
},
"packageType": {
"enum": [
"MONTHLY",
"YEARLY"
],
"type": "string",
"description": "The billing period. Required when the surviving agency has no plan yet."
},
"pricePerYear": {
"type": "number",
"minimum": 0,
"description": "The yearly price. Used when creating the surviving plan from scratch."
},
"numberOfSeats": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Override sub-brand seats included in the plan."
},
"pricePerMonth": {
"type": "number",
"minimum": 0,
"description": "The monthly price. Used when creating the surviving plan from scratch."
},
"extraSeatPrice": {
"type": "number",
"minimum": 0,
"description": "Override the price per extra seat."
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether TikTok campaigns are allowed. Only used when creating the surviving plan from scratch."
},
"numberOfCampaigns": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Override campaigns included in the plan (omit keeps current)."
},
"extraCampaignPrice": {
"type": "number",
"minimum": 0,
"description": "Override the price per extra campaign."
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether Instagram campaigns are allowed. Only used when creating the surviving plan from scratch."
},
"influencersPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Override influencers allowed per campaign."
},
"invitationsPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Override invitations allowed per campaign."
},
"proServiceFeePercentage": {
"type": "number",
"minimum": 0,
"description": "Set the agency's pro-creator service fee percentage."
},
"relationshipManagerEmail": {
"type": "string",
"description": "Override the agency's relationship-manager email."
},
"cashRewardServiceFeePercentage": {
"type": "number",
"minimum": 0,
"description": "Set the agency's cash-reward service fee percentage."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mergedBrandIds",
"performed",
"survivingAgency"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the merge was applied (true) or this is a preview only (false)."
},
"mergedBrandIds": {
"type": "array",
"items": {
"type": "number"
},
"description": "The brand ids that were (or would be) combined"
},
"survivingAgency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The surviving agency's id"
},
"name": {
"type": "string",
"description": "The surviving agency's name (after the merge, the first brand's name)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency the brands merge into, or null when the first brand has no agency"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Mark a creator's campaign task as complete by hand — the admin override for when a creator has delivered but the platform hasn't registered it automatically. It stamps the manual-completion flag and completion time (and the UGC completion on a UGC campaign), mirroring the web's one-click admin action, so it applies directly. Target it by applicationId (with the campaignId so a UGC campaign is handled correctly); no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application whose task to mark complete, from list-campaign-content or list-applications.
Clear enough to supply this argument.
campaignId
The id of the campaign the application belongs to (used to detect a UGC campaign).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the task was marked complete — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose task was marked complete"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "complete-task",
"title": "Manually mark a creator's task complete",
"description": "Mark a creator's campaign task as complete by hand — the admin override for when a creator has delivered but the platform hasn't registered it automatically. It stamps the manual-completion flag and completion time (and the UGC completion on a UGC campaign), mirroring the web's one-click admin action, so it applies directly. Target it by applicationId (with the campaignId so a UGC campaign is handled correctly); no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the application belongs to (used to detect a UGC campaign)."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application whose task to mark complete, from list-campaign-content or list-applications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the task was marked complete — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose task was marked complete"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Add a link to a category in the admin overview link directory, with a title, a url, an optional audience side (brand, influencer, or both), and an optional description. It applies directly, mirroring the web's one-click add. The directory is shared across all admins. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
categoryId
The id of the category to add the link to, from list-admin-links.
Clear enough to supply this argument.
description
What the link is for. Omit for none.
Clear enough to supply this argument.
side
The audience the link is relevant to. Omit or 'both' for no restriction.
Clear enough to supply this argument.
title
The link's display title.
Clear enough to supply this argument.
url
The link's URL.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"link"
],
"properties": {
"link": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"description": "The link that was created",
"additionalProperties": false
},
"created": {
"type": "boolean",
"description": "Whether the link was created — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-admin-link",
"title": "Create an admin overview link",
"description": "Add a link to a category in the admin overview link directory, with a title, a url, an optional audience side (brand, influencer, or both), and an optional description. It applies directly, mirroring the web's one-click add. The directory is shared across all admins. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categoryId",
"title",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The link's URL."
},
"side": {
"enum": [
"both",
"brand",
"influencer"
],
"type": "string",
"description": "The audience the link is relevant to. Omit or 'both' for no restriction."
},
"title": {
"type": "string",
"description": "The link's display title."
},
"categoryId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the category to add the link to, from list-admin-links."
},
"description": {
"type": "string",
"description": "What the link is for. Omit for none."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"link"
],
"properties": {
"link": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"description": "The link that was created",
"additionalProperties": false
},
"created": {
"type": "boolean",
"description": "Whether the link was created — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Create a new category in the admin overview link directory — a group that links are added to with create-admin-link. It applies directly, mirroring the web's one-click add. The directory is shared across all admins. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Input documentation gives an agent enough context to populate the arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"category",
"created"
],
"properties": {
"created": {
"type": "boolean",
"description": "Whether the category was created — always true; this tool writes directly"
},
"category": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"description": "The category that was created (with no links yet)",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-admin-link-category",
"title": "Create a link category",
"description": "Create a new category in the admin overview link directory — a group that links are added to with create-admin-link. It applies directly, mirroring the web's one-click add. The directory is shared across all admins. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The new category's name."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"category",
"created"
],
"properties": {
"created": {
"type": "boolean",
"description": "Whether the category was created — always true; this tool writes directly"
},
"category": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"description": "The category that was created (with no links yet)",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Pre-register a new agency and email its owner an activation link to finish registration themselves — the admin onboarding flow. Set the agency and its ENTERPRISE package terms and name the owner; the platform stores a pending record and emails the owner. Applies directly, as the web app does. The agency is not live until the owner completes registration via the emailed link (or finish-agency-registration). The owner's email must not already belong to a user (the platform refuses otherwise). salesEmail defaults to your own email. Admin-only, enforced platform-side.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address
The agency's street address.
Clear enough to supply this argument.
agencyName
The agency's name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
billingEmail
The agency's billing email.
Explain what happens when this optional value is omitted.
buyoutsPerYear
Buyouts allowed per year on the package.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cashRewardServiceFeePercentage
The cash-reward service fee percentage for the agency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city
The agency's city.
Clear enough to supply this argument.
country
The agency's country, e.g. Schweiz.
Clear enough to supply this argument.
credits
Credits to grant the agency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
currency
The account currency, e.g. CHF or EUR. Defaults to CHF.
Clear enough to supply this argument.
extraCampaignPrice
Price per extra campaign beyond the package's included count, in the account currency.
Clear enough to supply this argument.
extraSeatPrice
Price per extra sub-brand seat beyond the package's included count, in the account currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
firstName
The owner's first name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencersPerCampaign
Influencers allowed per campaign on the package.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
invitationsPerCampaign
Invitations allowed per campaign on the package.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
largeBrand
Whether this is a large-brand agency (one company) rather than a multi-client agency.
Clear enough to supply this argument.
lastName
The owner's last name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
mainUserEmail
The owner's email. The activation link is sent here; it must not already belong to a user.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfCampaigns
Campaigns included in the package (omit for unlimited).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfSeats
Sub-brand seats included in the package.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
packageType
The billing period. Defaults to YEARLY.
Clear enough to supply this argument.
postalCode
The agency's postal code.
Clear enough to supply this argument.
pricePerMonth
The monthly price, in the account currency.
Clear enough to supply this argument.
pricePerYear
The yearly price, in the account currency.
Clear enough to supply this argument.
proServiceFeePercentage
The pro-creator service fee percentage for the agency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
relationshipManagerEmail
The agency's relationship-manager email.
Clear enough to supply this argument.
salesEmail
The sales contact email. Defaults to your own email, as in the web app.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pendingAgency"
],
"properties": {
"pendingAgency": {
"type": "object",
"required": [
"activationUrl",
"billingEmail",
"buyoutsPerYear",
"country",
"credits",
"currency",
"influencersPerCampaign",
"invitationsPerCampaign",
"largeBrand",
"name",
"numberOfCampaigns",
"numberOfSeats",
"ownerEmail",
"ownerName",
"packageType",
"pendingId",
"pricePerMonth",
"pricePerYear",
"relationshipManagerEmail",
"salesEmail",
"uuid"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's name, or null"
},
"uuid": {
"type": "string",
"description": "The activation token in the emailed link the owner completes registration with"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null"
},
"credits": {
"type": "number",
"description": "Credits granted to the agency"
},
"currency": {
"type": "string",
"description": "The account currency"
},
"ownerName": {
"type": "string",
"description": "The owner's full name"
},
"pendingId": {
"type": "number",
"description": "The pre-registration record's own id. This is NOT the agency's id — it lives in a separate id space that collides with real agency ids, so passing it to get-agency or edit-agency reads or edits an unrelated agency. The real agency id does not exist until registration is completed (finish-agency-registration returns it). Identify this pending record by its uuid, never by this id."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"ownerEmail": {
"type": "string",
"description": "The owner's email the activation link was sent to"
},
"salesEmail": {
"type": "string",
"description": "The sales contact email"
},
"packageType": {
"type": "string",
"description": "The billing period, e.g. MONTHLY, YEARLY"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null"
},
"pricePerYear": {
"type": "number",
"description": "The yearly price, in the account currency"
},
"activationUrl": {
"type": "string",
"description": "The link the owner opens to complete registration and activate the agency"
},
"numberOfSeats": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats included, or null"
},
"pricePerMonth": {
"type": "number",
"description": "The monthly price, in the account currency"
},
"buyoutsPerYear": {
"type": "number",
"description": "Buyouts per year on the package"
},
"numberOfCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns included, or null for unlimited"
},
"influencersPerCampaign": {
"type": "number",
"description": "Influencers allowed per campaign"
},
"invitationsPerCampaign": {
"type": "number",
"description": "Invitations allowed per campaign"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The relationship-manager email, or null"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-agency",
"title": "Create an agency",
"description": "Pre-register a new agency and email its owner an activation link to finish registration themselves — the admin onboarding flow. Set the agency and its ENTERPRISE package terms and name the owner; the platform stores a pending record and emails the owner. Applies directly, as the web app does. The agency is not live until the owner completes registration via the emailed link (or finish-agency-registration). The owner's email must not already belong to a user (the platform refuses otherwise). salesEmail defaults to your own email. Admin-only, enforced platform-side.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyName",
"firstName",
"lastName",
"mainUserEmail"
],
"properties": {
"city": {
"type": "string",
"description": "The agency's city."
},
"address": {
"type": "string",
"description": "The agency's street address."
},
"country": {
"type": "string",
"description": "The agency's country, e.g. Schweiz."
},
"credits": {
"type": "number",
"minimum": 0,
"description": "Credits to grant the agency."
},
"website": {
"type": "string",
"description": "The agency's website."
},
"currency": {
"type": "string",
"description": "The account currency, e.g. CHF or EUR. Defaults to CHF."
},
"lastName": {
"type": "string",
"minLength": 1,
"description": "The owner's last name."
},
"firstName": {
"type": "string",
"minLength": 1,
"description": "The owner's first name."
},
"agencyName": {
"type": "string",
"minLength": 1,
"description": "The agency's name."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency (one company) rather than a multi-client agency."
},
"postalCode": {
"type": "string",
"description": "The agency's postal code."
},
"salesEmail": {
"type": "string",
"description": "The sales contact email. Defaults to your own email, as in the web app."
},
"packageType": {
"enum": [
"MONTHLY",
"YEARLY"
],
"type": "string",
"description": "The billing period. Defaults to YEARLY."
},
"billingEmail": {
"type": "string",
"description": "The agency's billing email."
},
"pricePerYear": {
"type": "number",
"minimum": 0,
"description": "The yearly price, in the account currency."
},
"mainUserEmail": {
"type": "string",
"minLength": 1,
"description": "The owner's email. The activation link is sent here; it must not already belong to a user."
},
"numberOfSeats": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Sub-brand seats included in the package."
},
"pricePerMonth": {
"type": "number",
"minimum": 0,
"description": "The monthly price, in the account currency."
},
"buyoutsPerYear": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Buyouts allowed per year on the package."
},
"extraSeatPrice": {
"type": "number",
"minimum": 0,
"description": "Price per extra sub-brand seat beyond the package's included count, in the account currency."
},
"numberOfCampaigns": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Campaigns included in the package (omit for unlimited)."
},
"extraCampaignPrice": {
"type": "number",
"minimum": 0,
"description": "Price per extra campaign beyond the package's included count, in the account currency."
},
"influencersPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Influencers allowed per campaign on the package."
},
"invitationsPerCampaign": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Invitations allowed per campaign on the package."
},
"proServiceFeePercentage": {
"type": "number",
"minimum": 0,
"description": "The pro-creator service fee percentage for the agency."
},
"relationshipManagerEmail": {
"type": "string",
"description": "The agency's relationship-manager email."
},
"cashRewardServiceFeePercentage": {
"type": "number",
"minimum": 0,
"description": "The cash-reward service fee percentage for the agency."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pendingAgency"
],
"properties": {
"pendingAgency": {
"type": "object",
"required": [
"activationUrl",
"billingEmail",
"buyoutsPerYear",
"country",
"credits",
"currency",
"influencersPerCampaign",
"invitationsPerCampaign",
"largeBrand",
"name",
"numberOfCampaigns",
"numberOfSeats",
"ownerEmail",
"ownerName",
"packageType",
"pendingId",
"pricePerMonth",
"pricePerYear",
"relationshipManagerEmail",
"salesEmail",
"uuid"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's name, or null"
},
"uuid": {
"type": "string",
"description": "The activation token in the emailed link the owner completes registration with"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null"
},
"credits": {
"type": "number",
"description": "Credits granted to the agency"
},
"currency": {
"type": "string",
"description": "The account currency"
},
"ownerName": {
"type": "string",
"description": "The owner's full name"
},
"pendingId": {
"type": "number",
"description": "The pre-registration record's own id. This is NOT the agency's id — it lives in a separate id space that collides with real agency ids, so passing it to get-agency or edit-agency reads or edits an unrelated agency. The real agency id does not exist until registration is completed (finish-agency-registration returns it). Identify this pending record by its uuid, never by this id."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"ownerEmail": {
"type": "string",
"description": "The owner's email the activation link was sent to"
},
"salesEmail": {
"type": "string",
"description": "The sales contact email"
},
"packageType": {
"type": "string",
"description": "The billing period, e.g. MONTHLY, YEARLY"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null"
},
"pricePerYear": {
"type": "number",
"description": "The yearly price, in the account currency"
},
"activationUrl": {
"type": "string",
"description": "The link the owner opens to complete registration and activate the agency"
},
"numberOfSeats": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats included, or null"
},
"pricePerMonth": {
"type": "number",
"description": "The monthly price, in the account currency"
},
"buyoutsPerYear": {
"type": "number",
"description": "Buyouts per year on the package"
},
"numberOfCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns included, or null for unlimited"
},
"influencersPerCampaign": {
"type": "number",
"description": "Influencers allowed per campaign"
},
"invitationsPerCampaign": {
"type": "number",
"description": "Invitations allowed per campaign"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The relationship-manager email, or null"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Create a new standalone brand — a company profile with its own auto-created agency and owner login — the same way the web app's brand signup does (POST /api/users/ with a company type). This mints a real owner account for the ownerEmail and emails them to verify it, so only run it with the owner's consent (the caller supplying their credentials is that consent). Give the fields directly, or pass the sessionId from draft-brand-from-website with the (edited) drafted fields so the platform reattaches the scraped logo and socials; the logo can also be given inline by path or URL. Applies directly, as the web app's signup does. Each owner email must be unique — the platform refuses a duplicate (user_email_exists). Use this, not create-agency, when you want a standalone brand (e.g. two brands to later join with combine-brands-into-agency); create-agency makes only an empty agency shell. The created brand is returned in full.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressCity
The brand's city.
Clear enough to supply this argument.
addressPostal
The brand's postal code.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressStreet
The brand's street address.
Clear enough to supply this argument.
bio
The brand's short bio.
Clear enough to supply this argument.
branchesData
The brand's branches/industry data.
Explain the meaning of this value, not just its name.
companyOverview
The brand's company overview text.
Clear enough to supply this argument.
country
The brand's country. The agency's currency is derived from it if currency is omitted.
Clear enough to supply this argument.
currency
The account currency (currency_symbol), e.g. CHF. Sets the auto-created agency's currency.
Clear enough to supply this argument.
customerPainPoints
The brand's customer pain points text.
Explain the meaning of this value, not just its name.
instagramUsername
The brand's Instagram handle (without the @).
Clear enough to supply this argument.
interests
The interest category ids to set on the brand. Ids come from list-interests, get-brand or draft-brand-from-website.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
logo › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Clear enough to supply this argument.
logo › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
logo › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Clear enough to supply this argument.
logo › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Clear enough to supply this argument.
name
The brand's name (company_name).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerEmail
The owner's email — the login this creates. Must not already belong to a user (user_email_exists).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerFirstName
The owner's first name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ownerLastName
The owner's last name.
Clear enough to supply this argument.
ownerPassword
The owner's password for the new login. Only set it with the owner's consent — it is theirs. Omit to create a passwordless account the owner activates later via email.
Clear enough to supply this argument.
phonenumber
The brand's phone number.
Clear enough to supply this argument.
placeDescription
The Google Places description for the brand's address.
Clear enough to supply this argument.
placeId
The Google Places id for the brand's address.
Clear enough to supply this argument.
productsOverview
The brand's products overview text.
Clear enough to supply this argument.
sessionId
The sessionId from draft-brand-from-website. Passing it lets the platform reattach the scraped logo and social handles that were not passed here.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-brand",
"title": "Create a standalone brand",
"description": "Create a new standalone brand — a company profile with its own auto-created agency and owner login — the same way the web app's brand signup does (POST /api/users/ with a company type). This mints a real owner account for the ownerEmail and emails them to verify it, so only run it with the owner's consent (the caller supplying their credentials is that consent). Give the fields directly, or pass the sessionId from draft-brand-from-website with the (edited) drafted fields so the platform reattaches the scraped logo and socials; the logo can also be given inline by path or URL. Applies directly, as the web app's signup does. Each owner email must be unique — the platform refuses a duplicate (user_email_exists). Use this, not create-agency, when you want a standalone brand (e.g. two brands to later join with combine-brands-into-agency); create-agency makes only an empty agency shell. The created brand is returned in full.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"ownerEmail"
],
"properties": {
"bio": {
"type": "string",
"description": "The brand's short bio."
},
"logo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "The brand's logo, given by a local file path (preferred) or a URL. When omitted and a sessionId is given, the platform reattaches the logo scraped by draft-brand-from-website. For a pasted logo with no readable path (the hosted server), call request-file-upload with target 'brand-logo'."
},
"name": {
"type": "string",
"minLength": 1,
"description": "The brand's name (company_name)."
},
"country": {
"type": "string",
"description": "The brand's country. The agency's currency is derived from it if currency is omitted."
},
"placeId": {
"type": "string",
"description": "The Google Places id for the brand's address."
},
"website": {
"type": "string",
"description": "The brand's website."
},
"currency": {
"type": "string",
"description": "The account currency (currency_symbol), e.g. CHF. Sets the auto-created agency's currency."
},
"interests": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "The interest category ids to set on the brand. Ids come from list-interests, get-brand or draft-brand-from-website."
},
"sessionId": {
"type": "string",
"description": "The sessionId from draft-brand-from-website. Passing it lets the platform reattach the scraped logo and social handles that were not passed here."
},
"ownerEmail": {
"type": "string",
"minLength": 1,
"description": "The owner's email — the login this creates. Must not already belong to a user (user_email_exists)."
},
"addressCity": {
"type": "string",
"description": "The brand's city."
},
"phonenumber": {
"type": "string",
"description": "The brand's phone number."
},
"branchesData": {
"type": "string",
"description": "The brand's branches/industry data."
},
"addressPostal": {
"type": "string",
"description": "The brand's postal code."
},
"addressStreet": {
"type": "string",
"description": "The brand's street address."
},
"ownerLastName": {
"type": "string",
"description": "The owner's last name."
},
"ownerPassword": {
"type": "string",
"description": "The owner's password for the new login. Only set it with the owner's consent — it is theirs. Omit to create a passwordless account the owner activates later via email."
},
"ownerFirstName": {
"type": "string",
"description": "The owner's first name."
},
"tiktokUsername": {
"type": "string",
"description": "The brand's TikTok handle (without the @)."
},
"companyOverview": {
"type": "string",
"description": "The brand's company overview text."
},
"placeDescription": {
"type": "string",
"description": "The Google Places description for the brand's address."
},
"productsOverview": {
"type": "string",
"description": "The brand's products overview text."
},
"instagramUsername": {
"type": "string",
"description": "The brand's Instagram handle (without the @)."
},
"customerPainPoints": {
"type": "string",
"description": "The brand's customer pain points text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Create a new draft campaign for a brand you may work on behalf of. Pass the brand (brandId + brandName, from list-brands) and the campaign's fields. A campaign belongs to exactly one brand, so this is brand-scoped — it refuses without a brand and does not accept an agency. The campaign is always created as a draft: nothing goes live and no influencer sees it, so this needs no confirmation and writes directly. Publishing it is a separate, confirmed step (publish-campaign). This is the manual path — you supply the fields directly. Before calling it, ALWAYS ask the user whether they want AI creation (create-campaign-with-ai, the recommended option, where the platform's AI drafts the campaign from a brief) or manual — even when they have already given explicit fields, because providing fields does NOT mean they prefer manual over AI. Only create here once the user has chosen manual, and pass their choice as `method: 'manual'` so the server does not ask again. The platform enforces validity (lengths, caps, channel rules); any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
accountTags
Accounts each influencer must tag in their content, without the leading @.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
aiRecommendations
Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bonusPool
Whether a bonus pool applies to the campaign.
Clear enough to supply this argument.
brandDoes
The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published.
Clear enough to supply this argument.
brandName
The brand's name, from list-brands. Stored on the campaign as its brand name and used to name the brand in the result.
Clear enough to supply this argument.
campaignLocations › items › city
The location's city.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › country
The location's country.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › description
A human-readable description of the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › placeId
The Google Place id identifying the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › postal
The location's postal code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › street
The location's street.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignSize
How many influencers the campaign is sized for. Subject to the account's subscription.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cashReward
Cash paid per influencer, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
castingStart
When casting opens, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
commercialDays
How many days influencers have to post their content.
Clear enough to supply this argument.
communityCodes
Whether the campaign uses community (discount) codes.
Clear enough to supply this argument.
completed
When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
contentApprovalMode
How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side.
Clear enough to supply this argument.
contentLanguage
The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
deadline
The application deadline, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
digitalShopUrl
The shop URL influencers link to, or null when there is none.
Clear enough to supply this argument.
dontsDescription
What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation.
Clear enough to supply this argument.
event
Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset.
Clear enough to supply this argument.
eventAddressCity
The event's city. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressCountry
The event's country. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressDescription
A description of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPlaceId
The Google Place id of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPostal
The event's postal code. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressStreet
The event's street address. Only applies to event campaigns.
Clear enough to supply this argument.
eventAttendedByInfluencer
Whether the influencer attends the event in person. Only applies to event campaigns.
Clear enough to supply this argument.
eventEnd
When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns.
Clear enough to supply this argument.
eventStart
When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns.
Clear enough to supply this argument.
hashtags
Hashtags each influencer must use, without the leading #.
Clear enough to supply this argument.
highlyRatedReward
Extra reward paid to highly rated influencers, in the account's currency.
Clear enough to supply this argument.
includeStoriesInReview
Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise.
Clear enough to supply this argument.
instagram
Whether the campaign runs on Instagram.
Clear enough to supply this argument.
instagramBrandedContentAds
Whether the campaign enables Instagram branded-content (partnership) ads.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
linkSticker
The URL for an Instagram story link sticker, or null when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
linkStickerTitle
The title shown on the Instagram story link sticker, or null when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locations
The locations the campaign targets, e.g. ["Schweiz"] or several regions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
longDescription
The full campaign brief, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
manualScheduling
Whether content scheduling is set manually rather than automatically by the platform.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfFeedposts
Feed posts required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfReels
Reels required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfStories
Stories required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfUgc
UGC videos required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
onGoing
Whether the campaign runs on an ongoing basis rather than a fixed window.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnership
Whether posts are labelled as paid partnerships.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnershipWith
The account a paid partnership names, or null when none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
performanceReward
Extra reward tied to performance, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preparation
When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preparationDays
How many days influencers have to prepare.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForBrands
Whether the campaign is hidden from other brands.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForInfluencers
Whether the campaign is private — reachable only by invitation, not shown in the public feed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
proInfluencer
Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
productVariant
The product variants offered (e.g. sizes or colours), or null when there are none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
revisions
Revisions allowed on delivered content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sellingPrice
The product's selling price, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceIsClothing
Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceType
What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sourceMaterial
Whether creators must supply the raw source footage. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
speedyReward
Extra reward paid for fast delivery, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
subtitles
Whether the UGC videos must include subtitles. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
task
The task influencers must complete, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktok
Whether the campaign runs on TikTok. Cannot be combined with UGC.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokAccountTags
The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokHashtags
The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › country
The ISO-2 country for the keyword plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › existingKeywordIds
Ids of already-tracked TikTok keywords to target.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › isInitialized
Whether the keyword plan has been initialized.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › newKeywords
New keyword strings to add to the plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › websiteUrl
A website URL used to seed keyword suggestions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokNumberOfMedias
TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokSparkAds
Whether the campaign enables TikTok Spark Ads.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The campaign's title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
typeOfCooperation
A free-text description of the cooperation type, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugc
Whether the campaign is a UGC campaign. Cannot be combined with TikTok.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugcExtraCashReward
Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
usesStructuredProductVariants
Whether productVariant is parsed as structured, one-per-line variants rather than free text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › mimeType
The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › name
The file name, e.g. brief.pdf — how the asset is labelled.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › path
An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › url
A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand this campaign belongs to, from list-brands. A campaign belongs to exactly one brand.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
method
The creation method the user has explicitly chosen. Pass 'manual' only once they have chosen manual over AI, to skip the server's own ai-vs-manual prompt; 'ai' returns guidance to use create-campaign-with-ai instead. Omit it when the user has not yet chosen, so the choice can be surfaced.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugcVideoLength
For a UGC campaign, the length in seconds of each video brief. Applied to every brief. Per-video length lives on the brief, not the campaign, so it is set here rather than as a normal field.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-campaign",
"title": "Create a draft campaign for a brand",
"description": "Create a new draft campaign for a brand you may work on behalf of. Pass the brand (brandId + brandName, from list-brands) and the campaign's fields. A campaign belongs to exactly one brand, so this is brand-scoped — it refuses without a brand and does not accept an agency. The campaign is always created as a draft: nothing goes live and no influencer sees it, so this needs no confirmation and writes directly. Publishing it is a separate, confirmed step (publish-campaign). This is the manual path — you supply the fields directly. Before calling it, ALWAYS ask the user whether they want AI creation (create-campaign-with-ai, the recommended option, where the platform's AI drafts the campaign from a brief) or manual — even when they have already given explicit fields, because providing fields does NOT mean they prefer manual over AI. Only create here once the user has chosen manual, and pass their choice as `method: 'manual'` so the server does not ask again. The platform enforces validity (lengths, caps, channel rules); any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"title"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign. Cannot be combined with TikTok."
},
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null to clear it."
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset."
},
"image": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "The campaign's main image, given by a local file path (preferred) or a URL — see the path/url fields for how to supply a pasted image. Required to publish, so set it here to save a later step."
},
"title": {
"type": "string",
"minLength": 1,
"description": "The campaign's title."
},
"assets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through."
},
"name": {
"type": "string",
"description": "The file name, e.g. brief.pdf — how the asset is labelled."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted."
}
}
},
"description": "Brief documents, videos or other assets to attach, each given by a local file path (preferred) or a URL."
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
}
},
"description": "Additional product images, each given by a local file path (preferred) or a URL. Typically up to 5."
},
"method": {
"enum": [
"ai",
"manual"
],
"type": "string",
"description": "The creation method the user has explicitly chosen. Pass 'manual' only once they have chosen manual over AI, to skip the server's own ai-vs-manual prompt; 'ai' returns guidance to use create-campaign-with-ai instead. Omit it when the user has not yet chosen, so the choice can be surfaced."
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok. Cannot be combined with UGC."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand this campaign belongs to, from list-brands. A campaign belongs to exactly one brand."
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign runs on an ongoing basis rather than a fixed window."
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline, as an ISO 8601 datetime, or null to leave unset."
},
"eventEnd": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns."
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags each influencer must use, without the leading #."
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies to the campaign."
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands. Stored on the campaign as its brand name and used to name the brand in the result."
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset."
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets, e.g. [\"Schweiz\"] or several regions."
},
"revisions": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Revisions allowed on delivered content."
},
"subtitles": {
"type": "boolean",
"description": "Whether the UGC videos must include subtitles. Only applies to UGC campaigns."
},
"cashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Cash paid per influencer, in the account's currency."
},
"eventStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns."
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts each influencer must tag in their content, without the leading @."
},
"linkSticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL for an Instagram story link sticker, or null when there is none."
},
"numberOfUgc": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "UGC videos required per influencer."
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it."
},
"serviceType": {
"enum": [
"cash",
"physical_product",
"voucher"
],
"type": "string",
"description": "What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type."
},
"campaignSize": {
"enum": [
"5-10",
"10-15",
"20+"
],
"type": "string",
"description": "How many influencers the campaign is sized for. Subject to the account's subscription."
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens, as an ISO 8601 datetime, or null to leave unset."
},
"sellingPrice": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The product's selling price, in the account's currency."
},
"speedyReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid for fast delivery, in the account's currency."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"numberOfReels": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Reels required per influencer."
},
"proInfluencer": {
"type": "boolean",
"description": "Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply."
},
"commercialDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to post their content."
},
"communityCodes": {
"type": "boolean",
"description": "Whether the campaign uses community (discount) codes."
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null when there is none."
},
"productVariant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product variants offered (e.g. sizes or colours), or null when there are none."
},
"sourceMaterial": {
"type": "boolean",
"description": "Whether creators must supply the raw source footage. Only applies to UGC campaigns."
},
"tiktokHashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too."
},
"tiktokSparkAds": {
"type": "boolean",
"description": "Whether the campaign enables TikTok Spark Ads."
},
"ugcVideoLength": {
"anyOf": [
{
"type": "number",
"const": 15
},
{
"type": "number",
"const": 30
}
],
"description": "For a UGC campaign, the length in seconds of each video brief. Applied to every brief. Per-video length lives on the brief, not the campaign, so it is set here rather than as a normal field."
},
"contentLanguage": {
"enum": [
"English",
"French",
"High German",
"Italian",
"Swiss German"
],
"type": "string",
"description": "The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German."
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null to clear it."
},
"numberOfStories": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Stories required per influencer."
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships."
},
"preparationDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to prepare."
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation."
},
"eventAddressCity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's city. Only applies to event campaigns."
},
"linkStickerTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The title shown on the Instagram story link sticker, or null when there is none."
},
"manualScheduling": {
"type": "boolean",
"description": "Whether content scheduling is set manually rather than automatically by the platform."
},
"privateForBrands": {
"type": "boolean",
"description": "Whether the campaign is hidden from other brands."
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on."
},
"campaignLocations": {
"type": "array",
"items": {
"type": "object",
"required": [
"placeId"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's city."
},
"postal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's postal code."
},
"street": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's street."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's country."
},
"placeId": {
"type": "string",
"description": "The Google Place id identifying the location."
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A human-readable description of the location."
}
}
},
"description": "The geocoded target locations, each keyed by a Google Place id. The precise counterpart to locations; use locations for a simple region name when a Place id is not available."
},
"highlyRatedReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid to highly rated influencers, in the account's currency."
},
"numberOfFeedposts": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Feed posts required per influencer."
},
"performanceReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward tied to performance, in the account's currency."
},
"serviceIsClothing": {
"type": "boolean",
"description": "Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product."
},
"tiktokAccountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too."
},
"tiktokKeywordPlan": {
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "The ISO-2 country for the keyword plan."
},
"websiteUrl": {
"type": "string",
"description": "A website URL used to seed keyword suggestions."
},
"newKeywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "New keyword strings to add to the plan."
},
"isInitialized": {
"type": "boolean",
"description": "Whether the keyword plan has been initialized."
},
"existingKeywordIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of already-tracked TikTok keywords to target."
}
},
"description": "The TikTok keyword-targeting plan. Only applies to TikTok campaigns."
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A free-text description of the cooperation type, or null to clear it."
},
"eventAddressPostal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's postal code. Only applies to event campaigns."
},
"eventAddressStreet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's street address. Only applies to event campaigns."
},
"ugcExtraCashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns."
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side."
},
"eventAddressCountry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's country. Only applies to event campaigns."
},
"eventAddressPlaceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Place id of the event location. Only applies to event campaigns."
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account a paid partnership names, or null when none."
},
"tiktokNumberOfMedias": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts."
},
"privateForInfluencers": {
"type": "boolean",
"description": "Whether the campaign is private — reachable only by invitation, not shown in the public feed."
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise."
},
"eventAddressDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A description of the event location. Only applies to event campaigns."
},
"eventAttendedByInfluencer": {
"type": "boolean",
"description": "Whether the influencer attends the event in person. Only applies to event campaigns."
},
"instagramBrandedContentAds": {
"type": "boolean",
"description": "Whether the campaign enables Instagram branded-content (partnership) ads."
},
"usesStructuredProductVariants": {
"type": "boolean",
"description": "Whether productVariant is parsed as structured, one-per-line variants rather than free text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Create a campaign for a brand by having the platform's own AI draft it from a brief — mirroring the platform's AI creation flow, and the recommended way to create a campaign. Pass the brand (brandId + brandName, from list-brands), a free-text brief, and the channel; optionally attach brief documents or images. It creates an empty draft, then has the platform's AI fill the title, description, product description, task and reward using the brand's profile for context, and returns the drafted campaign. Brand-scoped — it refuses without a brand and does not accept an agency. The result is always a draft; the AI does not set the casting start, deadline or completion dates, so set those (with edit-campaign) and review before publishing. For entering fields yourself instead, use create-campaign.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › mimeType
The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › name
The file name, e.g. brief.pdf — how the asset is labelled.
Clear enough to supply this argument.
assets › items › path
An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself.
Clear enough to supply this argument.
assets › items › url
A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through.
Clear enough to supply this argument.
brandId
The id of the brand this campaign belongs to, from list-brands. A campaign belongs to exactly one brand.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands. Stored on the campaign as its brand name and used to name the brand in the result.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brief
The free-text brief describing the campaign to create — the same prompt the platform's AI creation flow takes. The platform's AI drafts the campaign's title, description, product description, task and reward from this, drawing on the brand's profile. Give it enough to work with: a clear campaign goal, the product or feature being promoted, what the influencer should do, and any don'ts. A too-thin brief (e.g. just 'Instagram campaign for <brand>') is the usual cause of the platform's ai_campaign_creation_failed error.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
briefUploadToken
A token from request-ai-brief-upload, naming file(s) the user uploaded through its link for the AI to read. The two-step route for a brief document (PDF/image/doc) on the hosted server, where a pasted file has no path or URL to pass via files: call request-ai-brief-upload, share the link, let the user upload, then pass the token here. The uploaded file(s) are forwarded to the AI alongside anything in files.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignType
Which channel the campaign runs on. The empty draft is created with this type before the AI fills it.
Clear enough to supply this argument.
contentLanguage
The language the UGC videos must be in. Only applies when campaignType is ugc; defaults to Swiss German.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
files › items › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files › items › mimeType
The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files › items › name
The file name, e.g. brief.pdf — how the asset is labelled.
Clear enough to supply this argument.
files › items › path
An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
files › items › url
A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through.
Clear enough to supply this argument.
image › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Clear enough to supply this argument.
image › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
image › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Clear enough to supply this argument.
image › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
images › items › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Clear enough to supply this argument.
languageCode
The language the AI should write the campaign in. Defaults to the platform's own default when unset.
Clear enough to supply this argument.
locations
The locations the campaign targets, e.g. ["Schweiz"]. The AI does not set these.
Clear enough to supply this argument.
numberOfUgc
For a UGC campaign, how many video briefs to create (each a video the creator delivers). Defaults to 1.
Clear enough to supply this argument.
sourceMaterial
Whether creators must supply the raw source footage. Only applies when campaignType is ugc.
Clear enough to supply this argument.
subtitles
Whether the UGC videos must include subtitles. Only applies when campaignType is ugc.
Clear enough to supply this argument.
ugcVideoLength
For a UGC campaign, the length in seconds of each video brief.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-campaign-with-ai",
"title": "Create a campaign for a brand with AI",
"description": "Create a campaign for a brand by having the platform's own AI draft it from a brief — mirroring the platform's AI creation flow, and the recommended way to create a campaign. Pass the brand (brandId + brandName, from list-brands), a free-text brief, and the channel; optionally attach brief documents or images. It creates an empty draft, then has the platform's AI fill the title, description, product description, task and reward using the brand's profile for context, and returns the drafted campaign. Brand-scoped — it refuses without a brand and does not accept an agency. The result is always a draft; the AI does not set the casting start, deadline or completion dates, so set those (with edit-campaign) and review before publishing. For entering fields yourself instead, use create-campaign.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brief",
"campaignType"
],
"properties": {
"brief": {
"type": "string",
"minLength": 1,
"description": "The free-text brief describing the campaign to create — the same prompt the platform's AI creation flow takes. The platform's AI drafts the campaign's title, description, product description, task and reward from this, drawing on the brand's profile. Give it enough to work with: a clear campaign goal, the product or feature being promoted, what the influencer should do, and any don'ts. A too-thin brief (e.g. just 'Instagram campaign for <brand>') is the usual cause of the platform's ai_campaign_creation_failed error."
},
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through."
},
"name": {
"type": "string",
"description": "The file name, e.g. brief.pdf — how the asset is labelled."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted."
}
}
},
"description": "Optional documents for the platform's AI to read while drafting — brief documents (PDF/PPTX), product images, etc. — each given by a local file path (preferred, including a pasted file's temp path in Claude Code), a URL, or base64 bytes. Distinct from assets, which are stored on the campaign but NOT read by the AI. When a user pastes a file you have no path or URL for (the normal case on the hosted server), do not base64 it — use request-ai-brief-upload and pass its briefUploadToken instead. Best for small files; a very large file (e.g. a video) is impractical to pass this way."
},
"image": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "The campaign's main image, given by a local file path (preferred — including a pasted image's temp path) or a URL. Distinct from files (which the AI reads); this is the displayed image, required to publish. The AI does not generate one."
},
"assets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through."
},
"name": {
"type": "string",
"description": "The file name, e.g. brief.pdf — how the asset is labelled."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted."
}
}
},
"description": "Documents, videos or other assets to attach, each given by a local file path (preferred) or a URL. Distinct from files (which the AI reads to draft the campaign); these are stored on the campaign."
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
}
},
"description": "Additional product images, each given by a local file path (preferred) or a URL. Typically up to 5."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand this campaign belongs to, from list-brands. A campaign belongs to exactly one brand."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands. Stored on the campaign as its brand name and used to name the brand in the result."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets, e.g. [\"Schweiz\"]. The AI does not set these."
},
"subtitles": {
"type": "boolean",
"description": "Whether the UGC videos must include subtitles. Only applies when campaignType is ugc."
},
"numberOfUgc": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "For a UGC campaign, how many video briefs to create (each a video the creator delivers). Defaults to 1."
},
"campaignType": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the campaign runs on. The empty draft is created with this type before the AI fills it."
},
"languageCode": {
"enum": [
"de",
"en"
],
"type": "string",
"description": "The language the AI should write the campaign in. Defaults to the platform's own default when unset."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"sourceMaterial": {
"type": "boolean",
"description": "Whether creators must supply the raw source footage. Only applies when campaignType is ugc."
},
"ugcVideoLength": {
"anyOf": [
{
"type": "number",
"const": 15
},
{
"type": "number",
"const": 30
}
],
"description": "For a UGC campaign, the length in seconds of each video brief."
},
"contentLanguage": {
"enum": [
"English",
"French",
"High German",
"Italian",
"Swiss German"
],
"type": "string",
"description": "The language the UGC videos must be in. Only applies when campaignType is ugc; defaults to Swiss German."
},
"briefUploadToken": {
"type": "string",
"description": "A token from request-ai-brief-upload, naming file(s) the user uploaded through its link for the AI to read. The two-step route for a brief document (PDF/image/doc) on the hosted server, where a pasted file has no path or URL to pass via files: call request-ai-brief-upload, share the link, let the user upload, then pass the token here. The uploaded file(s) are forwarded to the AI alongside anything in files."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Create several identical draft campaigns of one type for a single brand in one request — the clearest win over creating them one at a time. Pass the brand (brandId + brandName, from list-brands), the count, and the shared campaign fields; every campaign in the batch is created with those same fields. A batch belongs to exactly one brand, so this is brand-scoped and does not accept an agency. The count is capped for safety. Every campaign is created as a draft — nothing goes live — so this needs no confirmation and writes directly; publishing them is a separate, confirmed step (publish-campaigns). Every created id and url is returned, and any that could not be created are reported explicitly rather than hidden behind a clean success.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
accountTags
Accounts each influencer must tag in their content, without the leading @.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
aiRecommendations
Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on.
Clear enough to supply this argument.
bonusPool
Whether a bonus pool applies to the campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandDoes
The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published.
Clear enough to supply this argument.
brandName
The brand's name, from list-brands. Stored on each campaign as its brand name and used to name the brand in the result.
Clear enough to supply this argument.
campaignLocations › items › city
The location's city.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › country
The location's country.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › description
A human-readable description of the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › placeId
The Google Place id identifying the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › postal
The location's postal code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › street
The location's street.
Clear enough to supply this argument.
campaignSize
How many influencers the campaign is sized for. Subject to the account's subscription.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cashReward
Cash paid per influencer, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
castingStart
When casting opens, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
commercialDays
How many days influencers have to post their content.
Clear enough to supply this argument.
communityCodes
Whether the campaign uses community (discount) codes.
Clear enough to supply this argument.
completed
When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
contentApprovalMode
How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side.
Clear enough to supply this argument.
contentLanguage
The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German.
Clear enough to supply this argument.
deadline
The application deadline, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
digitalShopUrl
The shop URL influencers link to, or null when there is none.
Clear enough to supply this argument.
dontsDescription
What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation.
Clear enough to supply this argument.
event
Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset.
Clear enough to supply this argument.
eventAddressCity
The event's city. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressCountry
The event's country. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressDescription
A description of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPlaceId
The Google Place id of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPostal
The event's postal code. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressStreet
The event's street address. Only applies to event campaigns.
Clear enough to supply this argument.
eventAttendedByInfluencer
Whether the influencer attends the event in person. Only applies to event campaigns.
Clear enough to supply this argument.
eventEnd
When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns.
Clear enough to supply this argument.
eventStart
When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns.
Clear enough to supply this argument.
hashtags
Hashtags each influencer must use, without the leading #.
Clear enough to supply this argument.
highlyRatedReward
Extra reward paid to highly rated influencers, in the account's currency.
Clear enough to supply this argument.
includeStoriesInReview
Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise.
Clear enough to supply this argument.
instagram
Whether the campaign runs on Instagram.
Clear enough to supply this argument.
instagramBrandedContentAds
Whether the campaign enables Instagram branded-content (partnership) ads.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
linkSticker
The URL for an Instagram story link sticker, or null when there is none.
Clear enough to supply this argument.
linkStickerTitle
The title shown on the Instagram story link sticker, or null when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locations
The locations the campaign targets, e.g. ["Schweiz"] or several regions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
longDescription
The full campaign brief, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
manualScheduling
Whether content scheduling is set manually rather than automatically by the platform.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfFeedposts
Feed posts required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfReels
Reels required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfStories
Stories required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfUgc
UGC videos required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
onGoing
Whether the campaign runs on an ongoing basis rather than a fixed window.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnership
Whether posts are labelled as paid partnerships.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnershipWith
The account a paid partnership names, or null when none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
performanceReward
Extra reward tied to performance, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preparation
When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it.
Clear enough to supply this argument.
preparationDays
How many days influencers have to prepare.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForBrands
Whether the campaign is hidden from other brands.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForInfluencers
Whether the campaign is private — reachable only by invitation, not shown in the public feed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
proInfluencer
Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
productVariant
The product variants offered (e.g. sizes or colours), or null when there are none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
revisions
Revisions allowed on delivered content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sellingPrice
The product's selling price, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceIsClothing
Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceType
What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sourceMaterial
Whether creators must supply the raw source footage. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
speedyReward
Extra reward paid for fast delivery, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
subtitles
Whether the UGC videos must include subtitles. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
task
The task influencers must complete, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktok
Whether the campaign runs on TikTok. Cannot be combined with UGC.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokAccountTags
The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokHashtags
The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › country
The ISO-2 country for the keyword plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › existingKeywordIds
Ids of already-tracked TikTok keywords to target.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › isInitialized
Whether the keyword plan has been initialized.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › newKeywords
New keyword strings to add to the plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › websiteUrl
A website URL used to seed keyword suggestions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokNumberOfMedias
TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokSparkAds
Whether the campaign enables TikTok Spark Ads.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The campaign's title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
typeOfCooperation
A free-text description of the cooperation type, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugc
Whether the campaign is a UGC campaign. Cannot be combined with TikTok.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugcExtraCashReward
Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
usesStructuredProductVariants
Whether productVariant is parsed as structured, one-per-line variants rather than free text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand these campaigns belong to, from list-brands. All belong to this one brand.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
count
How many identical draft campaigns to create for the brand, up to 20.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"failed",
"performed",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"position",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this one"
},
"position": {
"type": "number",
"description": "The 1-based position in the batch that could not be created"
}
},
"additionalProperties": false
},
"description": "Any campaigns in the batch that could not be created, reported rather than hidden"
},
"created": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The created campaign's id"
},
"url": {
"type": "string",
"description": "The created campaign's page in the Refluenced web app"
},
"title": {
"type": "string",
"description": "The created campaign's title"
}
},
"additionalProperties": false
},
"description": "Every campaign that was created, with its id and web url"
},
"performed": {
"type": "boolean",
"description": "Whether the batch was actually created — always true; these tools write directly"
},
"requested": {
"type": "number",
"description": "How many campaigns the request asked to create"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-campaigns",
"title": "Bulk-create draft campaigns",
"description": "Create several identical draft campaigns of one type for a single brand in one request — the clearest win over creating them one at a time. Pass the brand (brandId + brandName, from list-brands), the count, and the shared campaign fields; every campaign in the batch is created with those same fields. A batch belongs to exactly one brand, so this is brand-scoped and does not accept an agency. The count is capped for safety. Every campaign is created as a draft — nothing goes live — so this needs no confirmation and writes directly; publishing them is a separate, confirmed step (publish-campaigns). Every created id and url is returned, and any that could not be created are reported explicitly rather than hidden behind a clean success.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"title",
"count"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign. Cannot be combined with TikTok."
},
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null to clear it."
},
"count": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many identical draft campaigns to create for the brand, up to 20."
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset."
},
"title": {
"type": "string",
"minLength": 1,
"description": "The campaign's title."
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok. Cannot be combined with UGC."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand these campaigns belong to, from list-brands. All belong to this one brand."
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign runs on an ongoing basis rather than a fixed window."
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline, as an ISO 8601 datetime, or null to leave unset."
},
"eventEnd": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns."
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags each influencer must use, without the leading #."
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies to the campaign."
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands. Stored on each campaign as its brand name and used to name the brand in the result."
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset."
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets, e.g. [\"Schweiz\"] or several regions."
},
"revisions": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Revisions allowed on delivered content."
},
"subtitles": {
"type": "boolean",
"description": "Whether the UGC videos must include subtitles. Only applies to UGC campaigns."
},
"cashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Cash paid per influencer, in the account's currency."
},
"eventStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns."
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts each influencer must tag in their content, without the leading @."
},
"linkSticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL for an Instagram story link sticker, or null when there is none."
},
"numberOfUgc": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "UGC videos required per influencer."
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it."
},
"serviceType": {
"enum": [
"cash",
"physical_product",
"voucher"
],
"type": "string",
"description": "What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type."
},
"campaignSize": {
"enum": [
"5-10",
"10-15",
"20+"
],
"type": "string",
"description": "How many influencers the campaign is sized for. Subject to the account's subscription."
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens, as an ISO 8601 datetime, or null to leave unset."
},
"sellingPrice": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The product's selling price, in the account's currency."
},
"speedyReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid for fast delivery, in the account's currency."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"numberOfReels": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Reels required per influencer."
},
"proInfluencer": {
"type": "boolean",
"description": "Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply."
},
"commercialDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to post their content."
},
"communityCodes": {
"type": "boolean",
"description": "Whether the campaign uses community (discount) codes."
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null when there is none."
},
"productVariant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product variants offered (e.g. sizes or colours), or null when there are none."
},
"sourceMaterial": {
"type": "boolean",
"description": "Whether creators must supply the raw source footage. Only applies to UGC campaigns."
},
"tiktokHashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too."
},
"tiktokSparkAds": {
"type": "boolean",
"description": "Whether the campaign enables TikTok Spark Ads."
},
"contentLanguage": {
"enum": [
"English",
"French",
"High German",
"Italian",
"Swiss German"
],
"type": "string",
"description": "The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German."
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null to clear it."
},
"numberOfStories": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Stories required per influencer."
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships."
},
"preparationDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to prepare."
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation."
},
"eventAddressCity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's city. Only applies to event campaigns."
},
"linkStickerTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The title shown on the Instagram story link sticker, or null when there is none."
},
"manualScheduling": {
"type": "boolean",
"description": "Whether content scheduling is set manually rather than automatically by the platform."
},
"privateForBrands": {
"type": "boolean",
"description": "Whether the campaign is hidden from other brands."
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on."
},
"campaignLocations": {
"type": "array",
"items": {
"type": "object",
"required": [
"placeId"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's city."
},
"postal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's postal code."
},
"street": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's street."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's country."
},
"placeId": {
"type": "string",
"description": "The Google Place id identifying the location."
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A human-readable description of the location."
}
}
},
"description": "The geocoded target locations, each keyed by a Google Place id. The precise counterpart to locations; use locations for a simple region name when a Place id is not available."
},
"highlyRatedReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid to highly rated influencers, in the account's currency."
},
"numberOfFeedposts": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Feed posts required per influencer."
},
"performanceReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward tied to performance, in the account's currency."
},
"serviceIsClothing": {
"type": "boolean",
"description": "Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product."
},
"tiktokAccountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too."
},
"tiktokKeywordPlan": {
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "The ISO-2 country for the keyword plan."
},
"websiteUrl": {
"type": "string",
"description": "A website URL used to seed keyword suggestions."
},
"newKeywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "New keyword strings to add to the plan."
},
"isInitialized": {
"type": "boolean",
"description": "Whether the keyword plan has been initialized."
},
"existingKeywordIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of already-tracked TikTok keywords to target."
}
},
"description": "The TikTok keyword-targeting plan. Only applies to TikTok campaigns."
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A free-text description of the cooperation type, or null to clear it."
},
"eventAddressPostal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's postal code. Only applies to event campaigns."
},
"eventAddressStreet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's street address. Only applies to event campaigns."
},
"ugcExtraCashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns."
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side."
},
"eventAddressCountry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's country. Only applies to event campaigns."
},
"eventAddressPlaceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Place id of the event location. Only applies to event campaigns."
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account a paid partnership names, or null when none."
},
"tiktokNumberOfMedias": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts."
},
"privateForInfluencers": {
"type": "boolean",
"description": "Whether the campaign is private — reachable only by invitation, not shown in the public feed."
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise."
},
"eventAddressDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A description of the event location. Only applies to event campaigns."
},
"eventAttendedByInfluencer": {
"type": "boolean",
"description": "Whether the influencer attends the event in person. Only applies to event campaigns."
},
"instagramBrandedContentAds": {
"type": "boolean",
"description": "Whether the campaign enables Instagram branded-content (partnership) ads."
},
"usesStructuredProductVariants": {
"type": "boolean",
"description": "Whether productVariant is parsed as structured, one-per-line variants rather than free text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"failed",
"performed",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"position",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this one"
},
"position": {
"type": "number",
"description": "The 1-based position in the batch that could not be created"
}
},
"additionalProperties": false
},
"description": "Any campaigns in the batch that could not be created, reported rather than hidden"
},
"created": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The created campaign's id"
},
"url": {
"type": "string",
"description": "The created campaign's page in the Refluenced web app"
},
"title": {
"type": "string",
"description": "The created campaign's title"
}
},
"additionalProperties": false
},
"description": "Every campaign that was created, with its id and web url"
},
"performed": {
"type": "boolean",
"description": "Whether the batch was actually created — always true; these tools write directly"
},
"requested": {
"type": "number",
"description": "How many campaigns the request asked to create"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Create a new custom influencer group owned by a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a group belongs to exactly one owner. The name must be unique within that owner (the platform refuses group_with_this_name_already_exists). The group starts empty — add creators with add-influencers-to-group, or build one from a search with create-group-from-filters. Applies directly, as the web app creates directly.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies, to own the group. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, used to state the scope back to the user.
Clear enough to supply this argument.
brandId
The id of a brand, from list-brands, to own the group. Provide a brand or an agency, not both.
Clear enough to supply this argument.
brandName
The brand's name, from list-brands, used to state the scope back.
Clear enough to supply this argument.
description
An optional description for the group.
Explain the meaning of this value, not just its name.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
name
The name for the new group. Must be unique within the owning brand or agency.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-group",
"title": "Create an influencer group",
"description": "Create a new custom influencer group owned by a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a group belongs to exactly one owner. The name must be unique within that owner (the platform refuses group_with_this_name_already_exists). The group starts empty — add creators with add-influencers-to-group, or build one from a search with create-group-from-filters. Applies directly, as the web app creates directly.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The name for the new group. Must be unique within the owning brand or agency."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand, from list-brands, to own the group. Provide a brand or an agency, not both."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies, to own the group. Provide a brand or an agency, not both."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, used to state the scope back."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, used to state the scope back to the user."
},
"description": {
"type": "string",
"description": "An optional description for the group."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Build an influencer group from a network search: snapshot the verified creators currently matching a set of filters — followers, engagement, median views, countries, gender, interests (by name), and a free-text vibe search — into a group owned by a brand (brandId + brandName) or an agency (agencyId + agencyName), one scope, not both. Pass name to create a new group, or groupIds to add the matches to existing groups instead. This is a one-time snapshot of the current matches, not a live filter. Apply filters deliberately — with none, it matches every verified creator. Applies directly. If the vibe service is down the platform refuses (vibe_search_service_unavailable), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies, to own the group. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, to state the scope back.
Clear enough to supply this argument.
brandId
The id of a brand, from list-brands, to own the group. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands, to state the scope back.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
groupIds
Instead of creating a new group, add the matching creators to these existing groups (owned by the same brand or agency). Provide either groupIds or name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The name for the new group. Required unless groupIds is given. Must be unique within the owner.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channel
Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel.
Clear enough to supply this argument.
countries
Only members based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
engagementMax
Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
engagementMin
Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
followersMax
Only members with at most this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followersMin
Only members with at least this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
gender
Only members of this gender.
Clear enough to supply this argument.
interests
Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests).
Clear enough to supply this argument.
medianViewsMax
Only members with at most this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
medianViewsMin
Only members with at least this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentType
Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter members by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"groups"
],
"properties": {
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
},
"description": "The created group, or the groups the matching creators were added to"
},
"created": {
"type": "boolean",
"description": "True when a new group was created; false when creators were added to existing groups"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-group-from-filters",
"title": "Build a group from a creator search",
"description": "Build an influencer group from a network search: snapshot the verified creators currently matching a set of filters — followers, engagement, median views, countries, gender, interests (by name), and a free-text vibe search — into a group owned by a brand (brandId + brandName) or an agency (agencyId + agencyName), one scope, not both. Pass name to create a new group, or groupIds to add the matches to existing groups instead. This is a one-time snapshot of the current matches, not a live filter. Apply filters deliberately — with none, it matches every verified creator. Applies directly. If the vibe service is down the platform refuses (vibe_search_service_unavailable), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"name": {
"type": "string",
"description": "The name for the new group. Required unless groupIds is given. Must be unique within the owner."
},
"vibe": {
"type": "string",
"description": "Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only members of this gender."
},
"search": {
"type": "string",
"description": "Filter members by name, Instagram handle or TikTok handle."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand, from list-brands, to own the group. Provide a brand or an agency, not both."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies, to own the group. Provide a brand or an agency, not both."
},
"groupIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "Instead of creating a new group, add the matching creators to these existing groups (owned by the same brand or agency). Provide either groupIds or name."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, to state the scope back."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests)."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, to state the scope back."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many followers."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"engagementMax": {
"type": "number",
"description": "Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"engagementMin": {
"type": "number",
"description": "Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"created",
"groups"
],
"properties": {
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
},
"description": "The created group, or the groups the matching creators were added to"
},
"created": {
"type": "boolean",
"description": "True when a new group was created; false when creators were added to existing groups"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Load the meta-ads-operator skill before calling this tool, and follow it. Create a new ad set in one of Refluenced's Meta campaigns by copying an existing ad set's settings (optimization, placements, targeting, budget) — so the delivery choices stay ones a person made once — then renaming it and optionally changing its daily budget, countries and schedule. The ads of the template are not copied; add ads with create-partnership-ad. Always created PAUSED. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff). The template's targeting, exclusions and attribution are copied as they are, so pick a template of the same campaign type and read it with list-meta-ad-sets first.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The campaign to create the ad set in, from list-meta-campaigns. Omit to create it in the template's own campaign. Must be in the same ad account as the template.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
countries
Replace the template's locations (countries, regions and cities) with these country ISO codes, e.g. ["CH", "DE", "AT"]. Omit to keep the template's locations.
Clear enough to supply this argument.
dailyBudgetCents
Daily budget in the account currency's minor unit (cents), e.g. 5000 = 50.00 CHF. Omit to keep the template's. Not allowed when the campaign has a campaign budget (CBO).
Clear enough to supply this argument.
endTime
Scheduled end, ISO 8601 (e.g. 2026-11-30T23:59:00+0100). Omit to keep the template's.
Clear enough to supply this argument.
name
The new ad set's name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startTime
Scheduled start, ISO 8601. Omit to keep the template's.
Clear enough to supply this argument.
templateAdSetId
An existing ad set to copy settings from (optimization, placements, targeting, budget), from list-meta-ad-sets.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adSetId",
"adsManagerUrl",
"campaignId",
"campaignName",
"created",
"name",
"preview",
"status",
"templateAdSetId"
],
"properties": {
"name": {
"type": "string",
"description": "The new ad set's name"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "PAUSED once created, or null for a preview"
},
"adSetId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new ad set's id, or null for a preview"
},
"created": {
"type": "boolean",
"description": "Whether the ad set was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"campaignId": {
"type": "string",
"description": "The campaign the ad set is in"
},
"adAccountId": {
"type": "string",
"description": "The ad account"
},
"campaignName": {
"type": "string",
"description": "The campaign's name"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
},
"templateAdSetId": {
"type": "string",
"description": "The ad set it was copied from"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-meta-ad-set",
"title": "Create a Meta ad set from a template",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. Create a new ad set in one of Refluenced's Meta campaigns by copying an existing ad set's settings (optimization, placements, targeting, budget) — so the delivery choices stay ones a person made once — then renaming it and optionally changing its daily budget, countries and schedule. The ads of the template are not copied; add ads with create-partnership-ad. Always created PAUSED. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff). The template's targeting, exclusions and attribution are copied as they are, so pick a template of the same campaign type and read it with list-meta-ad-sets first.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name",
"templateAdSetId"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The new ad set's name."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"endTime": {
"type": "string",
"description": "Scheduled end, ISO 8601 (e.g. 2026-11-30T23:59:00+0100). Omit to keep the template's."
},
"countries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"description": "Replace the template's locations (countries, regions and cities) with these country ISO codes, e.g. [\"CH\", \"DE\", \"AT\"]. Omit to keep the template's locations."
},
"startTime": {
"type": "string",
"description": "Scheduled start, ISO 8601. Omit to keep the template's."
},
"campaignId": {
"type": "string",
"description": "The campaign to create the ad set in, from list-meta-campaigns. Omit to create it in the template's own campaign. Must be in the same ad account as the template."
},
"templateAdSetId": {
"type": "string",
"minLength": 1,
"description": "An existing ad set to copy settings from (optimization, placements, targeting, budget), from list-meta-ad-sets."
},
"dailyBudgetCents": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Daily budget in the account currency's minor unit (cents), e.g. 5000 = 50.00 CHF. Omit to keep the template's. Not allowed when the campaign has a campaign budget (CBO).",
"exclusiveMinimum": 0
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adSetId",
"adsManagerUrl",
"campaignId",
"campaignName",
"created",
"name",
"preview",
"status",
"templateAdSetId"
],
"properties": {
"name": {
"type": "string",
"description": "The new ad set's name"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "PAUSED once created, or null for a preview"
},
"adSetId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new ad set's id, or null for a preview"
},
"created": {
"type": "boolean",
"description": "Whether the ad set was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"campaignId": {
"type": "string",
"description": "The campaign the ad set is in"
},
"adAccountId": {
"type": "string",
"description": "The ad account"
},
"campaignName": {
"type": "string",
"description": "The campaign's name"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
},
"templateAdSetId": {
"type": "string",
"description": "The ad set it was copied from"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Load the meta-ads-operator skill before calling this tool, and follow it. Create a new, empty campaign in one of Refluenced's Meta ad accounts (from list-meta-ad-accounts) — the first step of running partnership ads end to end: campaign here, then an ad set with create-meta-ad-set (copied from a template ad set with the same objective), then ads with create-partnership-ad, then set-meta-status to go live. Sets name, objective, and optionally a campaign budget (CBO, daily or lifetime) with a bid strategy; without one, each ad set carries its own budget. Always created PAUSED. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff); names no brand. Decide the Employment special ad category before calling and pass specialAdCategories explicitly (an empty list when none applies); it is required.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adAccountId
The ad account to create the campaign in (act_…), from list-meta-ad-accounts.
Clear enough to supply this argument.
bidStrategy
Campaign bid strategy — only with a campaign budget (dailyBudgetCents or lifetimeBudgetCents). Omit for Meta's default, highest volume (LOWEST_COST_WITHOUT_CAP). The capped strategies need a bid or cost cap on each ad set.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
dailyBudgetCents
Campaign daily budget (Advantage campaign budget / CBO) in the account currency's minor unit, e.g. 5000 = 50.00 CHF. Pass this or lifetimeBudgetCents, not both; omit both to budget per ad set instead.
Clear enough to supply this argument.
lifetimeBudgetCents
Campaign lifetime budget (CBO) in minor units. Its ad sets then need an end time. Pass this or dailyBudgetCents, not both.
Clear enough to supply this argument.
name
The campaign name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
objective
The campaign objective. It fixes which optimization goals its ad sets may use, so a template ad set copied in with create-meta-ad-set should come from a campaign with the same objective.
Clear enough to supply this argument.
specialAdCategories
Meta's special ad categories, required by law for ads about these topics (they restrict targeting). Required: decide it explicitly — EMPLOYMENT for creator-recruitment campaigns per the playbook, an empty list when none applies.
Clear enough to supply this argument.
specialAdCategoryCountries
ISO country codes the special ad categories apply in. Required by Meta when specialAdCategories is set.
Resolve the mismatch between this description and its schema constraints.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adsManagerUrl",
"budget",
"campaignId",
"created",
"name",
"objective",
"preview",
"status"
],
"properties": {
"name": {
"type": "string",
"description": "The campaign name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign budget (CBO), or null when budgets are set per ad set"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "PAUSED once created, or null for a preview"
},
"created": {
"type": "boolean",
"description": "Whether the campaign was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"objective": {
"type": "string",
"description": "The campaign objective"
},
"campaignId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new campaign's id, or null for a preview"
},
"adAccountId": {
"type": "string",
"description": "The ad account"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-meta-campaign",
"title": "Create a Meta campaign",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. Create a new, empty campaign in one of Refluenced's Meta ad accounts (from list-meta-ad-accounts) — the first step of running partnership ads end to end: campaign here, then an ad set with create-meta-ad-set (copied from a template ad set with the same objective), then ads with create-partnership-ad, then set-meta-status to go live. Sets name, objective, and optionally a campaign budget (CBO, daily or lifetime) with a bid strategy; without one, each ad set carries its own budget. Always created PAUSED. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff); names no brand. Decide the Employment special ad category before calling and pass specialAdCategories explicitly (an empty list when none applies); it is required.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"name",
"objective",
"specialAdCategories"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The campaign name."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"objective": {
"enum": [
"OUTCOME_APP_PROMOTION",
"OUTCOME_AWARENESS",
"OUTCOME_ENGAGEMENT",
"OUTCOME_LEADS",
"OUTCOME_SALES",
"OUTCOME_TRAFFIC"
],
"type": "string",
"description": "The campaign objective. It fixes which optimization goals its ad sets may use, so a template ad set copied in with create-meta-ad-set should come from a campaign with the same objective."
},
"adAccountId": {
"type": "string",
"minLength": 1,
"description": "The ad account to create the campaign in (act_…), from list-meta-ad-accounts."
},
"bidStrategy": {
"enum": [
"COST_CAP",
"LOWEST_COST_WITH_BID_CAP",
"LOWEST_COST_WITH_MIN_ROAS",
"LOWEST_COST_WITHOUT_CAP"
],
"type": "string",
"description": "Campaign bid strategy — only with a campaign budget (dailyBudgetCents or lifetimeBudgetCents). Omit for Meta's default, highest volume (LOWEST_COST_WITHOUT_CAP). The capped strategies need a bid or cost cap on each ad set."
},
"dailyBudgetCents": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Campaign daily budget (Advantage campaign budget / CBO) in the account currency's minor unit, e.g. 5000 = 50.00 CHF. Pass this or lifetimeBudgetCents, not both; omit both to budget per ad set instead.",
"exclusiveMinimum": 0
},
"lifetimeBudgetCents": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Campaign lifetime budget (CBO) in minor units. Its ad sets then need an end time. Pass this or dailyBudgetCents, not both.",
"exclusiveMinimum": 0
},
"specialAdCategories": {
"type": "array",
"items": {
"enum": [
"CREDIT",
"EMPLOYMENT",
"FINANCIAL_PRODUCTS_SERVICES",
"HOUSING",
"ISSUES_ELECTIONS_POLITICS",
"ONLINE_GAMBLING_AND_GAMING"
],
"type": "string"
},
"description": "Meta's special ad categories, required by law for ads about these topics (they restrict targeting). Required: decide it explicitly — EMPLOYMENT for creator-recruitment campaigns per the playbook, an empty list when none applies."
},
"specialAdCategoryCountries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"description": "ISO country codes the special ad categories apply in. Required by Meta when specialAdCategories is set."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adsManagerUrl",
"budget",
"campaignId",
"created",
"name",
"objective",
"preview",
"status"
],
"properties": {
"name": {
"type": "string",
"description": "The campaign name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign budget (CBO), or null when budgets are set per ad set"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "PAUSED once created, or null for a preview"
},
"created": {
"type": "boolean",
"description": "Whether the campaign was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"objective": {
"type": "string",
"description": "The campaign objective"
},
"campaignId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new campaign's id, or null for a preview"
},
"adAccountId": {
"type": "string",
"description": "The ad account"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Load the meta-ads-operator skill before calling this tool, and follow it. Turn a creator's post into an Instagram partnership ad (creator + Refluenced handles in the header) inside an existing ad set of one of Refluenced's Meta ad accounts — replacing the manual paste of the ad code in Ads Manager. Build it from the creator's ad code (as list-ad-codes shows it) or a contentId from list-partnership-content. The ad set supplies budget, targeting and schedule; the ad is always created PAUSED. Enforced by the server: never into a brand acquisition (B2B) campaign; every Meta AI creative enhancement is switched off; app-promotion campaigns get INSTALL_MOBILE_APP to the ad set's store page; website destinations need websiteUrl and get the standard UTM parameters. The response reads the creative back (enhancements, call to action, URL parameters) and says whether it is launch-ready — show that to the user. If the creator has not granted permission yet, Meta holds the ad in pending delivery and sends them a request. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff).
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adCode
The partnership ad code the creator shared (the code list-ad-codes shows for an Instagram partnership campaign). Pass this or contentId, not both.
Clear enough to supply this argument.
adFormat
Whose handle the ad header shows: both shows the creator and Refluenced, creator_only shows only the creator, and auto lets Meta pick whichever performs better (Instagram only).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adName
A name for the new ad, per the playbook: <Format> - <Geo> - <n> <creator first name>.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adSetId
The existing Meta ad set to add the ad to, from list-meta-ad-sets (or a new one from create-meta-ad-set).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
callToAction
Call-to-action button for a website destination (with websiteUrl). Ignored for app-promotion campaigns, which always get INSTALL_MOBILE_APP linking to the ad set's store page. Defaults to LEARN_MORE.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
contentId
The creator's Instagram media id, from list-partnership-content. Pass this or adCode, not both.
Clear enough to supply this argument.
websiteUrl
Landing page for a website destination, e.g. https://refluenced.com/join/<brand> for a lead campaign. Required outside app-promotion campaigns. The standard UTM parameters are added automatically.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adId",
"adName",
"adSetId",
"adSetName",
"adsManagerUrl",
"callToAction",
"campaignName",
"created",
"creativeId",
"enhancementsOptedIn",
"launchReady",
"preview",
"source",
"status",
"urlTags"
],
"properties": {
"adId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The created ad's id, or null for a preview"
},
"adName": {
"type": "string",
"description": "The ad's name"
},
"source": {
"type": "string",
"description": "What the ad is built from: the ad code or the content id"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad's status — always PAUSED on creation — or null for a preview"
},
"adSetId": {
"type": "string",
"description": "The ad set the ad was added to"
},
"created": {
"type": "boolean",
"description": "Whether the ad was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"urlTags": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL parameters read back from Meta, or the planned ones in a preview"
},
"adSetName": {
"type": "string",
"description": "The ad set's name"
},
"creativeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The created ad creative's id, or null for a preview"
},
"adAccountId": {
"type": "string",
"description": "The ad account the ad lives in"
},
"launchReady": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the read-back passed the playbook checks (enhancements off, CTA, UTMs); null for a preview"
},
"callToAction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The call to action read back from Meta, or the planned one in a preview"
},
"campaignName": {
"type": "string",
"description": "The campaign the ad set belongs to"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to review the ad in Ads Manager"
},
"enhancementsOptedIn": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Creative features Meta still reports as OPT_IN — must be empty to be launch-ready; null for a preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-partnership-ad",
"title": "Create an Instagram partnership ad",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. Turn a creator's post into an Instagram partnership ad (creator + Refluenced handles in the header) inside an existing ad set of one of Refluenced's Meta ad accounts — replacing the manual paste of the ad code in Ads Manager. Build it from the creator's ad code (as list-ad-codes shows it) or a contentId from list-partnership-content. The ad set supplies budget, targeting and schedule; the ad is always created PAUSED. Enforced by the server: never into a brand acquisition (B2B) campaign; every Meta AI creative enhancement is switched off; app-promotion campaigns get INSTALL_MOBILE_APP to the ad set's store page; website destinations need websiteUrl and get the standard UTM parameters. The response reads the creative back (enhancements, call to action, URL parameters) and says whether it is launch-ready — show that to the user. If the creator has not granted permission yet, Meta holds the ad in pending delivery and sends them a request. Preview-then-confirm: with confirm false (default) it only previews. Admin-only (Refluenced staff).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adName",
"adSetId"
],
"properties": {
"adCode": {
"type": "string",
"description": "The partnership ad code the creator shared (the code list-ad-codes shows for an Instagram partnership campaign). Pass this or contentId, not both."
},
"adName": {
"type": "string",
"minLength": 1,
"description": "A name for the new ad, per the playbook: <Format> - <Geo> - <n> <creator first name>."
},
"adSetId": {
"type": "string",
"minLength": 1,
"description": "The existing Meta ad set to add the ad to, from list-meta-ad-sets (or a new one from create-meta-ad-set)."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"adFormat": {
"enum": [
"auto",
"both",
"creator_only"
],
"type": "string",
"default": "both",
"description": "Whose handle the ad header shows: both shows the creator and Refluenced, creator_only shows only the creator, and auto lets Meta pick whichever performs better (Instagram only)."
},
"contentId": {
"type": "string",
"description": "The creator's Instagram media id, from list-partnership-content. Pass this or adCode, not both."
},
"websiteUrl": {
"type": "string",
"format": "uri",
"description": "Landing page for a website destination, e.g. https://refluenced.com/join/<brand> for a lead campaign. Required outside app-promotion campaigns. The standard UTM parameters are added automatically."
},
"callToAction": {
"enum": [
"APPLY_NOW",
"DOWNLOAD",
"LEARN_MORE",
"SIGN_UP"
],
"type": "string",
"description": "Call-to-action button for a website destination (with websiteUrl). Ignored for app-promotion campaigns, which always get INSTALL_MOBILE_APP linking to the ad set's store page. Defaults to LEARN_MORE."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adId",
"adName",
"adSetId",
"adSetName",
"adsManagerUrl",
"callToAction",
"campaignName",
"created",
"creativeId",
"enhancementsOptedIn",
"launchReady",
"preview",
"source",
"status",
"urlTags"
],
"properties": {
"adId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The created ad's id, or null for a preview"
},
"adName": {
"type": "string",
"description": "The ad's name"
},
"source": {
"type": "string",
"description": "What the ad is built from: the ad code or the content id"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad's status — always PAUSED on creation — or null for a preview"
},
"adSetId": {
"type": "string",
"description": "The ad set the ad was added to"
},
"created": {
"type": "boolean",
"description": "Whether the ad was created (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once created"
},
"urlTags": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL parameters read back from Meta, or the planned ones in a preview"
},
"adSetName": {
"type": "string",
"description": "The ad set's name"
},
"creativeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The created ad creative's id, or null for a preview"
},
"adAccountId": {
"type": "string",
"description": "The ad account the ad lives in"
},
"launchReady": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the read-back passed the playbook checks (enhancements off, CTA, UTMs); null for a preview"
},
"callToAction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The call to action read back from Meta, or the planned one in a preview"
},
"campaignName": {
"type": "string",
"description": "The campaign the ad set belongs to"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to review the ad in Ads Manager"
},
"enhancementsOptedIn": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "null"
}
],
"description": "Creative features Meta still reports as OPT_IN — must be empty to be launch-ready; null for a preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Create a reusable reason template (title and body in both languages) for a punishment type, to pick from when issuing a punishment. Internal configuration, applied directly (the web app confirms nothing here). Admin-only; the platform rejects a duplicate name for the type and any refusal is surfaced as-is.
Describe the returned information so the agent knows whether it will answer the request.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bodyDe
The reason's body text in German, shown when the template is used.
Clear enough to supply this argument.
bodyEn
The reason's body text in English, shown when the template is used.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
A name for the template; spaces become underscores and it is upper-cased. Must be unique for the type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentType
Which punishment type this template is for — one of the six types (not the UNVERIFIED alias).
Clear enough to supply this argument.
titleDe
The reason's title in German.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
titleEn
The reason's title in English.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template"
],
"properties": {
"template": {
"type": "object",
"required": [
"id",
"name",
"punishmentType",
"translations"
],
"properties": {
"id": {
"type": "number",
"description": "The template's id, used as templateId when issuing or editing a punishment"
},
"name": {
"type": "string",
"description": "The template's display name"
},
"translations": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"id",
"languageCode",
"title"
],
"properties": {
"id": {
"type": "number",
"description": "The translation's id, used to edit it"
},
"body": {
"type": "string",
"description": "The reason body"
},
"title": {
"type": "string",
"description": "The reason title"
},
"languageCode": {
"type": "string",
"description": "The language of this translation, e.g. EN_EN or DE_CH"
}
},
"additionalProperties": false
},
"description": "The template's per-language title/body pairs"
},
"punishmentType": {
"type": "string",
"description": "The punishment type this template's reasons apply to — a ban-family type (PERMANENT_BAN/PROBATION/TIMED_BAN) or a channel strip (UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC)"
}
},
"description": "The template that was created, with its generated id",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-punishment-template",
"title": "Create a punishment reason template",
"description": "Create a reusable reason template (title and body in both languages) for a punishment type, to pick from when issuing a punishment. Internal configuration, applied directly (the web app confirms nothing here). Admin-only; the platform rejects a duplicate name for the type and any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bodyDe",
"bodyEn",
"name",
"punishmentType",
"titleDe",
"titleEn"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "A name for the template; spaces become underscores and it is upper-cased. Must be unique for the type."
},
"bodyDe": {
"type": "string",
"minLength": 1,
"description": "The reason's body text in German, shown when the template is used."
},
"bodyEn": {
"type": "string",
"minLength": 1,
"description": "The reason's body text in English, shown when the template is used."
},
"titleDe": {
"type": "string",
"minLength": 1,
"description": "The reason's title in German."
},
"titleEn": {
"type": "string",
"minLength": 1,
"description": "The reason's title in English."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Which punishment type this template is for — one of the six types (not the UNVERIFIED alias)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"template"
],
"properties": {
"template": {
"type": "object",
"required": [
"id",
"name",
"punishmentType",
"translations"
],
"properties": {
"id": {
"type": "number",
"description": "The template's id, used as templateId when issuing or editing a punishment"
},
"name": {
"type": "string",
"description": "The template's display name"
},
"translations": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"id",
"languageCode",
"title"
],
"properties": {
"id": {
"type": "number",
"description": "The translation's id, used to edit it"
},
"body": {
"type": "string",
"description": "The reason body"
},
"title": {
"type": "string",
"description": "The reason title"
},
"languageCode": {
"type": "string",
"description": "The language of this translation, e.g. EN_EN or DE_CH"
}
},
"additionalProperties": false
},
"description": "The template's per-language title/body pairs"
},
"punishmentType": {
"type": "string",
"description": "The punishment type this template's reasons apply to — a ban-family type (PERMANENT_BAN/PROBATION/TIMED_BAN) or a channel strip (UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC)"
}
},
"description": "The template that was created, with its generated id",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Create a new brand (sub-brand) under an agency, by hand or from a draft-brand-from-website draft. Agency-scoped: pass the agency (agencyId + agencyName, from list-agencies) — it refuses without one, and a sub-brand belongs to the agency, not to a single brand. Give the fields directly, or pass the sessionId from draft-brand-from-website with the (edited) drafted fields so the platform reattaches the scraped logo and socials. The logo can also be given inline by path or URL. Applies directly, since the web app confirms no sub-brand creation. The platform requires the agency to hold an active subscription that allows multiple brands and has a free seat; any refusal (no_active_subscription, multiple_brands_not_allowed_in_subscription, maximum_number_of_sub_brands_reached) is surfaced as-is. The created sub-brand is returned in full.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressCity
The sub-brand's city.
Clear enough to supply this argument.
addressPostal
The sub-brand's postal code.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressStreet
The sub-brand's street address.
Clear enough to supply this argument.
agencyId
The id of the agency to add the sub-brand under, from list-agencies. The sub-brand belongs to it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, used to name the agency in the result.
Clear enough to supply this argument.
bio
The sub-brand's short bio.
Clear enough to supply this argument.
branchesData
The sub-brand's branches/industry data.
Explain the meaning of this value, not just its name.
companyOverview
The sub-brand's company overview text.
Clear enough to supply this argument.
country
The sub-brand's country. The currency is taken from the agency regardless.
Clear enough to supply this argument.
customerPainPoints
The sub-brand's customer pain points text.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
instagramUsername
The sub-brand's Instagram handle (without the @).
Clear enough to supply this argument.
interests
The interest category ids to set on the sub-brand. Ids come from list-interests, get-brand or draft-brand-from-website.
Clear enough to supply this argument.
logo › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Clear enough to supply this argument.
logo › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
logo › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Clear enough to supply this argument.
logo › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Clear enough to supply this argument.
name
The sub-brand's name (company_name).
Clear enough to supply this argument.
phonenumber
The sub-brand's phone number.
Clear enough to supply this argument.
placeDescription
The Google Places description for the sub-brand's address.
Clear enough to supply this argument.
placeId
The Google Places id for the sub-brand's address.
Clear enough to supply this argument.
productsOverview
The sub-brand's products overview text.
Clear enough to supply this argument.
sessionId
The sessionId returned by draft-brand-from-website. Passing it lets the platform reattach the scraped logo and social handles that were not passed here.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The created sub-brand, or null when the call was refused before creating (e.g. an ambiguous agency)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-sub-brand",
"title": "Create a sub-brand under an agency",
"description": "Create a new brand (sub-brand) under an agency, by hand or from a draft-brand-from-website draft. Agency-scoped: pass the agency (agencyId + agencyName, from list-agencies) — it refuses without one, and a sub-brand belongs to the agency, not to a single brand. Give the fields directly, or pass the sessionId from draft-brand-from-website with the (edited) drafted fields so the platform reattaches the scraped logo and socials. The logo can also be given inline by path or URL. Applies directly, since the web app confirms no sub-brand creation. The platform requires the agency to hold an active subscription that allows multiple brands and has a free seat; any refusal (no_active_subscription, multiple_brands_not_allowed_in_subscription, maximum_number_of_sub_brands_reached) is surfaced as-is. The created sub-brand is returned in full.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"agencyName",
"name"
],
"properties": {
"bio": {
"type": "string",
"description": "The sub-brand's short bio."
},
"logo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "The sub-brand's logo, given by a local file path (preferred) or a URL. When omitted and a sessionId is given, the platform reattaches the logo scraped by draft-brand-from-website. For a pasted logo with no readable path (the hosted server), call request-file-upload with target 'brand-logo'."
},
"name": {
"type": "string",
"minLength": 1,
"description": "The sub-brand's name (company_name)."
},
"country": {
"type": "string",
"description": "The sub-brand's country. The currency is taken from the agency regardless."
},
"placeId": {
"type": "string",
"description": "The Google Places id for the sub-brand's address."
},
"website": {
"type": "string",
"description": "The sub-brand's website."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to add the sub-brand under, from list-agencies. The sub-brand belongs to it."
},
"interests": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "The interest category ids to set on the sub-brand. Ids come from list-interests, get-brand or draft-brand-from-website."
},
"sessionId": {
"type": "string",
"description": "The sessionId returned by draft-brand-from-website. Passing it lets the platform reattach the scraped logo and social handles that were not passed here."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, used to name the agency in the result."
},
"addressCity": {
"type": "string",
"description": "The sub-brand's city."
},
"phonenumber": {
"type": "string",
"description": "The sub-brand's phone number."
},
"branchesData": {
"type": "string",
"description": "The sub-brand's branches/industry data."
},
"addressPostal": {
"type": "string",
"description": "The sub-brand's postal code."
},
"addressStreet": {
"type": "string",
"description": "The sub-brand's street address."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"tiktokUsername": {
"type": "string",
"description": "The sub-brand's TikTok handle (without the @)."
},
"companyOverview": {
"type": "string",
"description": "The sub-brand's company overview text."
},
"placeDescription": {
"type": "string",
"description": "The Google Places description for the sub-brand's address."
},
"productsOverview": {
"type": "string",
"description": "The sub-brand's products overview text."
},
"instagramUsername": {
"type": "string",
"description": "The sub-brand's Instagram handle (without the @)."
},
"customerPainPoints": {
"type": "string",
"description": "The sub-brand's customer pain points text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The created sub-brand, or null when the call was refused before creating (e.g. an ambiguous agency)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Start a TikTok-search visibility report for a brand by its website — including brands that do not exist on the Refluenced platform at all. The tool scrapes the site, auto-generates the keywords, discovers the competitors (plus any you pass — your list is never exclusive), searches TikTok, and scores the brand against them keyword by keyword, with content gaps and quick wins. The run takes about a minute or two. The call returns a report id right away and never blocks. Where the client renders a live report panel, the panel then fills in on its own as the run completes; otherwise retrieve the finished report with get-tiktok-visibility-report using that id — that call waits for the run and tells you to call it again if it is not done yet, so repeat until it returns the report. Either way, do not schedule a background task or re-prompt. Competitors can only be set here, at creation — there is no tool to add them to an existing report; only keywords can be added later with add-tiktok-keywords once the report is complete. Present the scores and breakdowns as charts. Names no brand — it is keyed by the website.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
competitors
Competitors to seed the scoring with — set only here, at creation. The tool always also auto-discovers competitors from the TikTok results, so this list is never exclusive. Omit to let it discover them all.
Clear enough to supply this argument.
region
The national TikTok market to run the search in and score the brand's visibility against.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
websiteUrl
The brand's website, e.g. https://www.example.com — the report is keyed by this, not a platform brand.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "create-tiktok-visibility-report",
"title": "Create a TikTok visibility report",
"description": "Start a TikTok-search visibility report for a brand by its website — including brands that do not exist on the Refluenced platform at all. The tool scrapes the site, auto-generates the keywords, discovers the competitors (plus any you pass — your list is never exclusive), searches TikTok, and scores the brand against them keyword by keyword, with content gaps and quick wins. The run takes about a minute or two. The call returns a report id right away and never blocks. Where the client renders a live report panel, the panel then fills in on its own as the run completes; otherwise retrieve the finished report with get-tiktok-visibility-report using that id — that call waits for the run and tells you to call it again if it is not done yet, so repeat until it returns the report. Either way, do not schedule a background task or re-prompt. Competitors can only be set here, at creation — there is no tool to add them to an existing report; only keywords can be added later with add-tiktok-keywords once the report is complete. Present the scores and breakdowns as charts. Names no brand — it is keyed by the website.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"websiteUrl"
],
"properties": {
"region": {
"enum": [
"AT",
"CH",
"DE",
"GB",
"US"
],
"type": "string",
"default": "DE",
"description": "The national TikTok market to run the search in and score the brand's visibility against."
},
"websiteUrl": {
"type": "string",
"minLength": 1,
"description": "The brand's website, e.g. https://www.example.com — the report is keyed by this, not a platform brand."
},
"competitors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Competitors to seed the scoring with — set only here, at creation. The tool always also auto-discovers competitors from the TikTok results, so this list is never exclusive. Omit to let it discover them all."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Delete a link from the admin overview directory. It is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the link; set confirm true to delete. Protected links cannot be deleted — the platform refuses with protected_link_cannot_be_deleted, surfaced as-is. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
linkId
The id of the link to delete, from list-admin-links.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"linkId"
],
"properties": {
"linkId": {
"type": "number",
"description": "The link that was targeted"
},
"deleted": {
"type": "boolean",
"description": "Whether the link was deleted (false for a preview)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-admin-link",
"title": "Delete an admin overview link",
"description": "Delete a link from the admin overview directory. It is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the link; set confirm true to delete. Protected links cannot be deleted — the platform refuses with protected_link_cannot_be_deleted, surfaced as-is. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"linkId"
],
"properties": {
"linkId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the link to delete, from list-admin-links."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"linkId"
],
"properties": {
"linkId": {
"type": "number",
"description": "The link that was targeted"
},
"deleted": {
"type": "boolean",
"description": "Whether the link was deleted (false for a preview)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Delete a category from the admin overview link directory. This also deletes every link inside it, so it is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the category and how many links it would remove; set confirm true to delete. Protected categories cannot be deleted — the platform refuses with protected_category_cannot_be_deleted, surfaced as-is. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
categoryId
The id of the category to delete, from list-admin-links.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categoryId",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the category was deleted (false for a preview)"
},
"categoryId": {
"type": "number",
"description": "The category that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-admin-link-category",
"title": "Delete an admin overview link category",
"description": "Delete a category from the admin overview link directory. This also deletes every link inside it, so it is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the category and how many links it would remove; set confirm true to delete. Protected categories cannot be deleted — the platform refuses with protected_category_cannot_be_deleted, surfaced as-is. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categoryId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"categoryId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the category to delete, from list-admin-links."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categoryId",
"deleted"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the category was deleted (false for a preview)"
},
"categoryId": {
"type": "number",
"description": "The category that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Permanently delete every draft campaign belonging to one brand in a single request — an irreversible change, so it is preview-then-confirm. It is brand-scoped: pass the brand (brandId + brandName, from list-brands); an agency is not a valid scope. Only drafts are affected — published, live, and completed campaigns are untouched. The preview names the brand and how many drafts would go, with a sample of their titles. The platform enforces access; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand whose draft campaigns to delete, from list-brands.
Clear enough to supply this argument.
brandName
The brand's name, from list-brands, used to name the brand in the preview.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"deletedCount",
"draftCount",
"message",
"performed"
],
"properties": {
"brand": {
"type": "string",
"description": "The brand whose draft campaigns these are."
},
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, the brand, the count and a sample of titles; once confirmed, how many were deleted. The same text as the text block, so a client reading structured output sees it too."
},
"performed": {
"type": "boolean",
"description": "Whether the deletion was applied (true) or this is a preview only (false)."
},
"draftCount": {
"type": "number",
"description": "How many draft campaigns the brand currently has — the number a confirm would delete."
},
"deletedCount": {
"type": "number",
"description": "How many draft campaigns were deleted (0 for a preview or when the brand had none)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-brand-drafts",
"title": "Delete all of a brand's draft campaigns",
"description": "Permanently delete every draft campaign belonging to one brand in a single request — an irreversible change, so it is preview-then-confirm. It is brand-scoped: pass the brand (brandId + brandName, from list-brands); an agency is not a valid scope. Only drafts are affected — published, live, and completed campaigns are untouched. The preview names the brand and how many drafts would go, with a sample of their titles. The platform enforces access; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose draft campaigns to delete, from list-brands."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, used to name the brand in the preview."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"deletedCount",
"draftCount",
"message",
"performed"
],
"properties": {
"brand": {
"type": "string",
"description": "The brand whose draft campaigns these are."
},
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, the brand, the count and a sample of titles; once confirmed, how many were deleted. The same text as the text block, so a client reading structured output sees it too."
},
"performed": {
"type": "boolean",
"description": "Whether the deletion was applied (true) or this is a preview only (false)."
},
"draftCount": {
"type": "number",
"description": "How many draft campaigns the brand currently has — the number a confirm would delete."
},
"deletedCount": {
"type": "number",
"description": "How many draft campaigns were deleted (0 for a preview or when the brand had none)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Delete a campaign — an irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. A draft is deleted permanently; a live campaign is taken down (soft-deleted) so it no longer runs. The preview states which of the two will happen. The platform enforces the rest; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign to delete, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"kind",
"performed"
],
"properties": {
"kind": {
"enum": [
"draft",
"live"
],
"type": "string",
"description": "Whether a draft was permanently deleted or a live campaign was taken down (soft-deleted)."
},
"deleted": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The deleted campaign's id"
},
"url": {
"type": "string",
"description": "The deleted campaign's page in the Refluenced web app"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The deleted campaign's title, or null for an untitled draft"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The deleted campaign once confirmed, or null for a preview where nothing was deleted yet."
},
"performed": {
"type": "boolean",
"description": "Whether the deletion was applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-campaign",
"title": "Delete a campaign",
"description": "Delete a campaign — an irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. A draft is deleted permanently; a live campaign is taken down (soft-deleted) so it no longer runs. The preview states which of the two will happen. The platform enforces the rest; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to delete, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"kind",
"performed"
],
"properties": {
"kind": {
"enum": [
"draft",
"live"
],
"type": "string",
"description": "Whether a draft was permanently deleted or a live campaign was taken down (soft-deleted)."
},
"deleted": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The deleted campaign's id"
},
"url": {
"type": "string",
"description": "The deleted campaign's page in the Refluenced web app"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The deleted campaign's title, or null for an untitled draft"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The deleted campaign once confirmed, or null for a preview where nothing was deleted yet."
},
"performed": {
"type": "boolean",
"description": "Whether the deletion was applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Delete a saved influencer-filter preset. Target it by presetId (from list-filter-presets); no scope is needed, the platform resolves the owner from the preset and gates deletion to it. Applies directly, as the web app removes a preset directly.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
presetId
The id of the preset to delete, from list-filter-presets.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"presetId"
],
"properties": {
"presetId": {
"type": "number",
"description": "The preset that was deleted"
},
"performed": {
"type": "boolean",
"description": "Whether the preset was deleted — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-filter-preset",
"title": "Delete a saved filter preset",
"description": "Delete a saved influencer-filter preset. Target it by presetId (from list-filter-presets); no scope is needed, the platform resolves the owner from the preset and gates deletion to it. Applies directly, as the web app removes a preset directly.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"presetId"
],
"properties": {
"presetId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the preset to delete, from list-filter-presets."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"presetId"
],
"properties": {
"presetId": {
"type": "number",
"description": "The preset that was deleted"
},
"performed": {
"type": "boolean",
"description": "Whether the preset was deleted — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Delete an influencer group by id (from list-groups). It is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the group and how many members it holds; set confirm true to delete. This removes the group itself, not the creators in it. Only a brand or agency member with write access may delete; the platform refuses otherwise (group_deletion_not_allowed), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"groupId"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the group was deleted (false for a preview)"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-group",
"title": "Delete an influencer group",
"description": "Delete an influencer group by id (from list-groups). It is preview-then-confirm, mirroring the web's confirmation dialog: called with confirm false (the default) it only previews, naming the group and how many members it holds; set confirm true to delete. This removes the group itself, not the creators in it. Only a brand or agency member with write access may delete; the platform refuses otherwise (group_deletion_not_allowed), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to delete, from list-groups."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"groupId"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the group was deleted (false for a preview)"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Delete a creator's account by their influencer id — the edit page's account-deletion action. This is irreversible: it anonymises the profile, deactivates the login, removes their brand/agency memberships and notification preferences, and deactivates their open applications. Because it is destructive and outward-facing, it is preview-then-confirm: called with confirm false (the default) it only previews, naming the creator; set confirm true to delete. The platform refuses a non-admin whose account has a recent accepted campaign (has_accepted_campaign) — surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"influencerId",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"deleted": {
"type": "boolean",
"description": "Whether the account was deleted (false for a preview)"
},
"influencerId": {
"type": "number",
"description": "The influencer profile id that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-influencer-account",
"title": "Delete an influencer's account",
"description": "Delete a creator's account by their influencer id — the edit page's account-deletion action. This is irreversible: it anonymises the profile, deactivates the login, removes their brand/agency memberships and notification preferences, and deactivates their open applications. Because it is destructive and outward-facing, it is preview-then-confirm: called with confirm false (the default) it only previews, naming the creator; set confirm true to delete. The platform refuses a non-admin whose account has a recent accepted campaign (has_accepted_campaign) — surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"influencerId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The influencer profile id, from search-influencer-network or get-influencer."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"influencerId",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"deleted": {
"type": "boolean",
"description": "Whether the account was deleted (false for a preview)"
},
"influencerId": {
"type": "number",
"description": "The influencer profile id that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Delete a reusable punishment reason template and its translations. The web app confirms this, so it is preview-then-confirm. Target it by templateId (from list-punishment-templates); no brand is selected. Existing punishments that used the template keep their own copied reason text — only the link is cleared. Admin-only; any platform refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
templateId
The id of the reason template to delete, from list-punishment-templates.
Clear enough to supply this argument.
templateName
The template's name, used to name it in the confirmation preview. Omit to have the preview refer to it by id only.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"templateId"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the template was deleted"
},
"templateId": {
"type": "number",
"description": "The id of the template that was deleted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-punishment-template",
"title": "Delete a punishment reason template",
"description": "Delete a reusable punishment reason template and its translations. The web app confirms this, so it is preview-then-confirm. Target it by templateId (from list-punishment-templates); no brand is selected. Existing punishments that used the template keep their own copied reason text — only the link is cleared. Admin-only; any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"templateId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"templateId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the reason template to delete, from list-punishment-templates."
},
"templateName": {
"type": "string",
"description": "The template's name, used to name it in the confirmation preview. Omit to have the preview refer to it by id only."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"templateId"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the template was deleted"
},
"templateId": {
"type": "number",
"description": "The id of the template that was deleted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Delete a stray TikTok submission by its id — the reporting view's admin remove-video action. The id is the TikTok-video media id from list-campaign-media (type TIKTOK), not the aweme id. This is a hard delete: it also removes the submission's insight history, votes and bookmarks, then recomputes the owning application's cached TikTok figures and completion. Because it is destructive, it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to delete. Admin-only platform-side — a non-admin is refused, surfaced as-is. The platform exposes no read for a single submission, so name it from the list-campaign-media result you found it in.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
submissionId
The TikTok submission's id (the TikTok-video media id from list-campaign-media, not the aweme id).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"submissionId"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the submission was deleted (false for a preview)"
},
"submissionId": {
"type": "number",
"description": "The TikTok submission id that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "delete-tiktok-submission",
"title": "Delete a TikTok submission",
"description": "Delete a stray TikTok submission by its id — the reporting view's admin remove-video action. The id is the TikTok-video media id from list-campaign-media (type TIKTOK), not the aweme id. This is a hard delete: it also removes the submission's insight history, votes and bookmarks, then recomputes the owning application's cached TikTok figures and completion. Because it is destructive, it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to delete. Admin-only platform-side — a non-admin is refused, surfaced as-is. The platform exposes no read for a single submission, so name it from the list-campaign-media result you found it in.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"submissionId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"submissionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The TikTok submission's id (the TikTok-video media id from list-campaign-media, not the aweme id)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"deleted",
"submissionId"
],
"properties": {
"deleted": {
"type": "boolean",
"description": "Whether the submission was deleted (false for a preview)"
},
"submissionId": {
"type": "number",
"description": "The TikTok submission id that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Return the queryable schema of the Refluenced platform database — its tables, their columns and types, and the foreign keys that join them — for answering a data question no other tool covers, or one a tool answers only in part because it does not expose the field the question turns on (for example a campaign's dates). This is the first step of the open-data fallback: describe the schema, then write and run a query with run-data-query. Admin-only (Refluenced staff) and read-only; it names no brand. Sensitive tables and columns (password hashes, tokens, OAuth credentials, sessions) are masked out and never appear. Pass `search` or `tables` to focus on the relevant part of a large schema; omit both to get everything. Reaches the database directly, so a configuration or connection error is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Optional case-insensitive substring to keep only tables whose name contains it (e.g. 'campaign', 'subscription', 'influencer'). Omit to get every table.
Clear enough to supply this argument.
tables
Optional exact table names to return (e.g. ['imprint_baseuser', 'campaign_campaign']). Omit to get every table. Combined with search, a table matching either is kept.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"foreignKeys",
"tableCount",
"tables",
"totalTableCount"
],
"properties": {
"tables": {
"type": "array",
"items": {
"type": "object",
"required": [
"columns",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Table name (Django default <app_label>_<model>)"
},
"columns": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"nullable",
"type"
],
"properties": {
"name": {
"type": "string",
"description": "Column name"
},
"type": {
"type": "string",
"description": "Postgres data type"
},
"nullable": {
"type": "boolean",
"description": "Whether the column may be NULL"
}
},
"additionalProperties": false
},
"description": "The table's columns, in definition order, with masked columns already removed"
}
},
"additionalProperties": false
},
"description": "The queryable tables, with every masked table and column already removed"
},
"tableCount": {
"type": "number",
"description": "How many tables are in this response after filtering"
},
"foreignKeys": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"foreignColumn",
"foreignTable",
"table"
],
"properties": {
"table": {
"type": "string",
"description": "The table the foreign key is on"
},
"column": {
"type": "string",
"description": "The referencing column on `table`"
},
"foreignTable": {
"type": "string",
"description": "The table this key points at"
},
"foreignColumn": {
"type": "string",
"description": "The referenced column on `foreignTable`"
}
},
"additionalProperties": false
},
"description": "Foreign keys touching the returned tables, so the model knows how to join them"
},
"totalTableCount": {
"type": "number",
"description": "How many queryable tables exist in total, before any filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "describe-data-schema",
"title": "Describe the data schema",
"description": "Return the queryable schema of the Refluenced platform database — its tables, their columns and types, and the foreign keys that join them — for answering a data question no other tool covers, or one a tool answers only in part because it does not expose the field the question turns on (for example a campaign's dates). This is the first step of the open-data fallback: describe the schema, then write and run a query with run-data-query. Admin-only (Refluenced staff) and read-only; it names no brand. Sensitive tables and columns (password hashes, tokens, OAuth credentials, sessions) are masked out and never appear. Pass `search` or `tables` to focus on the relevant part of a large schema; omit both to get everything. Reaches the database directly, so a configuration or connection error is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"search": {
"type": "string",
"description": "Optional case-insensitive substring to keep only tables whose name contains it (e.g. 'campaign', 'subscription', 'influencer'). Omit to get every table."
},
"tables": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional exact table names to return (e.g. ['imprint_baseuser', 'campaign_campaign']). Omit to get every table. Combined with search, a table matching either is kept."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"foreignKeys",
"tableCount",
"tables",
"totalTableCount"
],
"properties": {
"tables": {
"type": "array",
"items": {
"type": "object",
"required": [
"columns",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Table name (Django default <app_label>_<model>)"
},
"columns": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"nullable",
"type"
],
"properties": {
"name": {
"type": "string",
"description": "Column name"
},
"type": {
"type": "string",
"description": "Postgres data type"
},
"nullable": {
"type": "boolean",
"description": "Whether the column may be NULL"
}
},
"additionalProperties": false
},
"description": "The table's columns, in definition order, with masked columns already removed"
}
},
"additionalProperties": false
},
"description": "The queryable tables, with every masked table and column already removed"
},
"tableCount": {
"type": "number",
"description": "How many tables are in this response after filtering"
},
"foreignKeys": {
"type": "array",
"items": {
"type": "object",
"required": [
"column",
"foreignColumn",
"foreignTable",
"table"
],
"properties": {
"table": {
"type": "string",
"description": "The table the foreign key is on"
},
"column": {
"type": "string",
"description": "The referencing column on `table`"
},
"foreignTable": {
"type": "string",
"description": "The table this key points at"
},
"foreignColumn": {
"type": "string",
"description": "The referenced column on `foreignTable`"
}
},
"additionalProperties": false
},
"description": "Foreign keys touching the returned tables, so the model knows how to join them"
},
"totalTableCount": {
"type": "number",
"description": "How many queryable tables exist in total, before any filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Remove a saved payment method from a brand, by its Stripe id (from list-agency-payment-cards). Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. Because it removes a billing method, it is preview-then-confirm: called with confirm false (the default) it previews the method it would detach, naming what was asked about; set confirm true to remove it. The platform refuses detaching a method not on file (payment_method_not_found) or the last one while a subscription is active (last_payment_method_cannot_be_detached), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Give this OR brandId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand whose payment method to detach, from list-brands. Give this OR agencyId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
paymentMethodId
The Stripe payment-method id (pm_…) to detach, from list-agency-payment-cards.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"detached",
"paymentMethodId"
],
"properties": {
"detached": {
"type": "boolean",
"description": "Whether the method was detached (false for a preview)"
},
"paymentMethodId": {
"type": "string",
"description": "The payment method that was targeted"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "detach-agency-card",
"title": "Detach a brand's payment card",
"description": "Remove a saved payment method from a brand, by its Stripe id (from list-agency-payment-cards). Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. Because it removes a billing method, it is preview-then-confirm: called with confirm false (the default) it previews the method it would detach, naming what was asked about; set confirm true to remove it. The platform refuses detaching a method not on file (payment_method_not_found) or the last one while a subscription is active (last_payment_method_cannot_be_detached), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"paymentMethodId"
],
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose payment method to detach, from list-brands. Give this OR agencyId."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"paymentMethodId": {
"type": "string",
"description": "The Stripe payment-method id (pm_…) to detach, from list-agency-payment-cards."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"detached",
"paymentMethodId"
],
"properties": {
"detached": {
"type": "boolean",
"description": "Whether the method was detached (false for a preview)"
},
"paymentMethodId": {
"type": "string",
"description": "The payment method that was targeted"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Dismiss a review ticket that needs no further action — the action queue's 'no further action'. It resolves the ticket (status → RESOLVED) and applies directly, mirroring the one-click web action; the change is internal and reversible with reopen-review-ticket. This does not do the underlying work — mark a task complete, respond to a cancellation, or discipline a creator with the dedicated tools first, then dismiss. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
note
An internal note recording why the ticket was dismissed; kept on the record, not shown to anyone. Omit to dismiss without recording a note.
Clear enough to supply this argument.
ticketId
The id of the review ticket to dismiss, from list-review-tickets.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"ticket"
],
"properties": {
"ticket": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"description": "The ticket after dismissal, now RESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the ticket was dismissed — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "dismiss-review-ticket",
"title": "Dismiss an admin hub review ticket",
"description": "Dismiss a review ticket that needs no further action — the action queue's 'no further action'. It resolves the ticket (status → RESOLVED) and applies directly, mirroring the one-click web action; the change is internal and reversible with reopen-review-ticket. This does not do the underlying work — mark a task complete, respond to a cancellation, or discipline a creator with the dedicated tools first, then dismiss. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ticketId"
],
"properties": {
"note": {
"type": "string",
"description": "An internal note recording why the ticket was dismissed; kept on the record, not shown to anyone. Omit to dismiss without recording a note."
},
"ticketId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the review ticket to dismiss, from list-review-tickets."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"ticket"
],
"properties": {
"ticket": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"description": "The ticket after dismissal, now RESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the ticket was dismissed — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Generate the client-ready reporting PDF for a campaign and return a one-time link the user opens to download it. The PDF has the summary dashboard, charts, top performers and the per-influencer table — the same file the web app's 'Download PDF' produces. UGC campaigns have no PDF. If reporting has not synced yet the platform returns no_report_data. For the spreadsheet export use get-campaign-reporting's sheetsExportUrl instead. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose report PDF to prepare, from list-campaigns, search-campaigns or get-campaign.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"downloadUrl",
"expiresAt",
"filename"
],
"properties": {
"filename": {
"type": "string",
"description": "The PDF's filename"
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working"
},
"campaignId": {
"type": "number",
"description": "The campaign the report is for"
},
"downloadUrl": {
"type": "string",
"description": "A one-time link the user opens to download the PDF"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "download-campaign-report-pdf",
"title": "Prepare a campaign's report PDF for download",
"description": "Generate the client-ready reporting PDF for a campaign and return a one-time link the user opens to download it. The PDF has the summary dashboard, charts, top performers and the per-influencer table — the same file the web app's 'Download PDF' produces. UGC campaigns have no PDF. If reporting has not synced yet the platform returns no_report_data. For the spreadsheet export use get-campaign-reporting's sheetsExportUrl instead. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose report PDF to prepare, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"downloadUrl",
"expiresAt",
"filename"
],
"properties": {
"filename": {
"type": "string",
"description": "The PDF's filename"
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working"
},
"campaignId": {
"type": "number",
"description": "The campaign the report is for"
},
"downloadUrl": {
"type": "string",
"description": "A one-time link the user opens to download the PDF"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Return a link to a completed TikTok-visibility report's PDF — the same file the tool's web app downloads. The report must be complete (the tool refuses one still running). The link is public and needs no sign-in, so it can be opened or shared directly. Names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
reportId
The id of the TikTok-visibility report whose PDF to get, from create-tiktok-visibility-report or get-tiktok-visibility-report; it must have finished running (the tool refuses one still in progress).
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"pdfUrl",
"reportId",
"reportUrl"
],
"properties": {
"pdfUrl": {
"type": "string",
"description": "A public link to the report's PDF — open it to download"
},
"reportId": {
"type": "string",
"description": "The report the PDF is for"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the report is for, or null when not yet known"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "download-tiktok-report-pdf",
"title": "Get a TikTok report's PDF",
"description": "Return a link to a completed TikTok-visibility report's PDF — the same file the tool's web app downloads. The report must be complete (the tool refuses one still running). The link is public and needs no sign-in, so it can be opened or shared directly. Names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"minLength": 1,
"description": "The id of the TikTok-visibility report whose PDF to get, from create-tiktok-visibility-report or get-tiktok-visibility-report; it must have finished running (the tool refuses one still in progress)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"pdfUrl",
"reportId",
"reportUrl"
],
"properties": {
"pdfUrl": {
"type": "string",
"description": "A public link to the report's PDF — open it to download"
},
"reportId": {
"type": "string",
"description": "The report the PDF is for"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the report is for, or null when not yet known"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Draft a brand profile from a website using the platform's scraping AI — the same flow the web app's 'create with AI' uses. Give a website; it scrapes the site and drafts the brand's name, logo, socials, overview, products, customer pain points, bio, and interest categories, reporting progress as each arrives. It persists nothing — review and edit the returned draft, then pass it (with the returned sessionId) to create-sub-brand, which reattaches the scraped logo. The scrape can take up to ~90s and may finish only partially for some sites (complete=false), in which case fill the missing fields by hand.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country
Two-letter country hint for the scrape, e.g. CH. Defaults to the request's language region.
Clear enough to supply this argument.
language
Language the drafted text should be written in, e.g. en or de. Defaults to the request language.
Clear enough to supply this argument.
website
The brand's website to scrape, e.g. https://www.example.com. The AI drafts the brand profile from it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"complete",
"draft",
"sessionId"
],
"properties": {
"draft": {
"type": "object",
"required": [
"bio",
"companyOverview",
"customerPainPoints",
"instagramUsername",
"interests",
"logoUrl",
"name",
"productsOverview",
"tiktokUsername",
"website"
],
"properties": {
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted short bio, or null when the scrape did not produce one"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted brand name, or null"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A URL to the scraped logo image, or null. Passed through via sessionId."
},
"website": {
"type": "string",
"description": "The website that was scraped"
},
"interests": {
"type": "array",
"items": {
"type": "number"
},
"description": "The interest category ids the AI matched (may be empty)"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The TikTok handle found on the site, or null"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted company overview, or null"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted products overview, or null"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Instagram handle found on the site, or null"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted customer pain points, or null"
}
},
"additionalProperties": false
},
"complete": {
"type": "boolean",
"description": "Whether the scrape finished fully. When false, only some fields were drafted — fill the rest by hand."
},
"sessionId": {
"type": "string",
"description": "Pass this to create-sub-brand alongside the (edited) fields so the platform reattaches the scraped logo."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "draft-brand-from-website",
"title": "Draft a brand from a website",
"description": "Draft a brand profile from a website using the platform's scraping AI — the same flow the web app's 'create with AI' uses. Give a website; it scrapes the site and drafts the brand's name, logo, socials, overview, products, customer pain points, bio, and interest categories, reporting progress as each arrives. It persists nothing — review and edit the returned draft, then pass it (with the returned sessionId) to create-sub-brand, which reattaches the scraped logo. The scrape can take up to ~90s and may finish only partially for some sites (complete=false), in which case fill the missing fields by hand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"website"
],
"properties": {
"country": {
"type": "string",
"description": "Two-letter country hint for the scrape, e.g. CH. Defaults to the request's language region."
},
"website": {
"type": "string",
"minLength": 1,
"description": "The brand's website to scrape, e.g. https://www.example.com. The AI drafts the brand profile from it."
},
"language": {
"type": "string",
"description": "Language the drafted text should be written in, e.g. en or de. Defaults to the request language."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"complete",
"draft",
"sessionId"
],
"properties": {
"draft": {
"type": "object",
"required": [
"bio",
"companyOverview",
"customerPainPoints",
"instagramUsername",
"interests",
"logoUrl",
"name",
"productsOverview",
"tiktokUsername",
"website"
],
"properties": {
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted short bio, or null when the scrape did not produce one"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted brand name, or null"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A URL to the scraped logo image, or null. Passed through via sessionId."
},
"website": {
"type": "string",
"description": "The website that was scraped"
},
"interests": {
"type": "array",
"items": {
"type": "number"
},
"description": "The interest category ids the AI matched (may be empty)"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The TikTok handle found on the site, or null"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted company overview, or null"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted products overview, or null"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Instagram handle found on the site, or null"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The drafted customer pain points, or null"
}
},
"additionalProperties": false
},
"complete": {
"type": "boolean",
"description": "Whether the scrape finished fully. When false, only some fields were drafted — fill the rest by hand."
},
"sessionId": {
"type": "string",
"description": "Pass this to create-sub-brand alongside the (edited) fields so the platform reattaches the scraped logo."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Duplicate an existing campaign, optionally as a different channel. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Pass targetType to copy it as instagram, tiktok or ugc, or omit it to keep the source's own type. The copy is always created as a draft — never live and never started as a side effect — so it changes nothing outward and applies directly with no confirmation; review and start it deliberately afterwards. When the target type does not use a field the source had, that difference is reported rather than silently dropped. Any platform refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign to duplicate, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
targetType
The channel the copy should run on. Omit to keep the source campaign's own type. Copying to a different type does not carry over fields that type does not use; those differences are reported, not hidden.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"droppedFields"
],
"properties": {
"campaign": {
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"description": "The new duplicate campaign in full.",
"additionalProperties": false
},
"droppedFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields the source campaign had that the copy does not, when the target type does not use them"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "duplicate-campaign",
"title": "Duplicate a campaign",
"description": "Duplicate an existing campaign, optionally as a different channel. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Pass targetType to copy it as instagram, tiktok or ugc, or omit it to keep the source's own type. The copy is always created as a draft — never live and never started as a side effect — so it changes nothing outward and applies directly with no confirmation; review and start it deliberately afterwards. When the target type does not use a field the source had, that difference is reported rather than silently dropped. Any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to duplicate, from list-campaigns, search-campaigns or get-campaign."
},
"targetType": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "The channel the copy should run on. Omit to keep the source campaign's own type. Copying to a different type does not carry over fields that type does not use; those differences are reported, not hidden."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"droppedFields"
],
"properties": {
"campaign": {
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"description": "The new duplicate campaign in full.",
"additionalProperties": false
},
"droppedFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields the source campaign had that the copy does not, when the target type does not use them"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Edit a link in the admin overview directory — its title, url, audience side, description, or which category it belongs to. Provide at least one field to change. It applies directly, mirroring the web's inline edit. Works on protected links too (only deletion is blocked). Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
categoryId
Move the link to this category, by category id from list-admin-links. Omit to leave it unchanged.
Clear enough to supply this argument.
description
A new description. Omit to leave it unchanged.
Clear enough to supply this argument.
linkId
The id of the link to edit, from list-admin-links.
Clear enough to supply this argument.
side
A new audience side ('both' clears any restriction). Omit to leave it unchanged.
Clear enough to supply this argument.
title
A new title. Omit to leave it unchanged.
Clear enough to supply this argument.
url
A new URL. Omit to leave it unchanged.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"link",
"updated"
],
"properties": {
"link": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"description": "The link after the edit",
"additionalProperties": false
},
"updated": {
"type": "boolean",
"description": "Whether the link was updated — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-admin-link",
"title": "Edit an admin overview link",
"description": "Edit a link in the admin overview directory — its title, url, audience side, description, or which category it belongs to. Provide at least one field to change. It applies directly, mirroring the web's inline edit. Works on protected links too (only deletion is blocked). Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"linkId"
],
"properties": {
"url": {
"type": "string",
"description": "A new URL. Omit to leave it unchanged."
},
"side": {
"enum": [
"both",
"brand",
"influencer"
],
"type": "string",
"description": "A new audience side ('both' clears any restriction). Omit to leave it unchanged."
},
"title": {
"type": "string",
"description": "A new title. Omit to leave it unchanged."
},
"linkId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the link to edit, from list-admin-links."
},
"categoryId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Move the link to this category, by category id from list-admin-links. Omit to leave it unchanged."
},
"description": {
"type": "string",
"description": "A new description. Omit to leave it unchanged."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"link",
"updated"
],
"properties": {
"link": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"description": "The link after the edit",
"additionalProperties": false
},
"updated": {
"type": "boolean",
"description": "Whether the link was updated — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Rename an admin overview link category and/or change its sort position. Provide a new name, a new order, or both — at least one is required. It applies directly, mirroring the web's inline edit. Works on protected categories too (only deletion is blocked). Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
categoryId
The id of the category to edit, from list-admin-links.
Clear enough to supply this argument.
name
A new name for the category. Omit to leave it unchanged.
Clear enough to supply this argument.
order
A new sort position (ascending, lower shows first). Omit to leave it unchanged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"category",
"updated"
],
"properties": {
"updated": {
"type": "boolean",
"description": "Whether the category was updated — always true; this tool writes directly"
},
"category": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"description": "The category after the edit",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-admin-link-category",
"title": "Edit an admin overview link category",
"description": "Rename an admin overview link category and/or change its sort position. Provide a new name, a new order, or both — at least one is required. It applies directly, mirroring the web's inline edit. Works on protected categories too (only deletion is blocked). Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categoryId"
],
"properties": {
"name": {
"type": "string",
"description": "A new name for the category. Omit to leave it unchanged."
},
"order": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "A new sort position (ascending, lower shows first). Omit to leave it unchanged."
},
"categoryId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the category to edit, from list-admin-links."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"category",
"updated"
],
"properties": {
"updated": {
"type": "boolean",
"description": "Whether the category was updated — always true; this tool writes directly"
},
"category": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"description": "The category after the edit",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Edit an agency's profile by id (from list-agencies or list-brands), including its logo. Pass only the fields to change — everything else is left as is. Applies directly, since the web app confirms no agency-profile edit. The platform owns validity: credits, the service-fee percentages, bexio_contact_id, and the disable_intercom / disable_generative_ai flags are admin-only, and referral codes must differ and be unique — any refusal is surfaced as-is. The edited agency is returned in full; currency, bexio_contact_id and filled_out_agency_data are written but not shown back, since the platform's read omits them. This does not change the agency's subscription (use assign-subscription or edit-subscription).
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address
The agency's street address.
Clear enough to supply this argument.
agencyId
The id of the agency to edit, from list-agencies or list-brands.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bexioContactId
The Bexio contact id. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
billingEmail
The agency's billing email.
Clear enough to supply this argument.
cashRewardServiceFeePercentage
The cash-reward service fee percentage. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
city
The agency's city.
Clear enough to supply this argument.
country
The agency's country.
Clear enough to supply this argument.
credits
The agency's credit balance. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
currency
The agency's currency, e.g. CHF. Cascades to its brands. Not shown in the returned agency.
Clear enough to supply this argument.
description
The agency's description.
Clear enough to supply this argument.
disableGenerativeAi
Whether to disable generative AI for the agency. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
disableIntercom
Whether to disable Intercom for the agency. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
filledOutAgencyData
Whether the agency's onboarding data is complete. Not shown in the returned agency.
Clear enough to supply this argument.
largeBrand
Whether this is a large-brand agency (one company) rather than a multi-client agency.
Clear enough to supply this argument.
logo › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Clear enough to supply this argument.
logo › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
logo › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Clear enough to supply this argument.
logo › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Clear enough to supply this argument.
multipleBrands
Whether the agency may hold more than one brand.
Clear enough to supply this argument.
name
The agency's name.
Clear enough to supply this argument.
placeDescription
The Google Places description for the agency's address.
Clear enough to supply this argument.
placeId
The Google Places id for the agency's address.
Clear enough to supply this argument.
postalCode
The agency's postal code.
Clear enough to supply this argument.
proServiceFeePercentage
The pro-creator service fee percentage. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
referralCode
The agency's private referral code. Must differ from the public one and be unique — enforced platform-side.
Clear enough to supply this argument.
referralCodePublic
The agency's public referral code. Must differ from the private one and be unique — enforced platform-side.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"changed"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"address",
"billingEmail",
"cashRewardServiceFeePercentage",
"city",
"country",
"created",
"credits",
"description",
"disableGenerativeAi",
"disableIntercom",
"futureSubscription",
"id",
"largeBrand",
"logoUrl",
"multipleBrands",
"name",
"ownerId",
"placeDescription",
"placeId",
"postalCode",
"proServiceFeePercentage",
"referralCode",
"referralCodePublic",
"relationshipManagerEmail",
"salesEmail",
"subscription",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"url": {
"type": "string",
"description": "The agency's page in the Refluenced web app"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is set"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's street address, or null when none is set"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is set"
},
"created": {
"type": "string",
"description": "When the agency was created (ISO 8601)"
},
"credits": {
"type": "number",
"description": "The agency's credit balance"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the agency's logo image, or null when none is set"
},
"ownerId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of the agency's owner, or null when unknown"
},
"placeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places id for the address, or null"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is set"
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"postalCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's postal code, or null when none is set"
},
"salesEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's sales email, or null when none is set"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's description, or null when none is set"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null when none is set"
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's active subscription — the plan every brand under it runs on — or null when it has none"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency may hold more than one brand"
},
"disableIntercom": {
"type": "boolean",
"description": "Whether Intercom is disabled for this agency"
},
"placeDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places description for the address, or null"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's public referral code, or null when none is set"
},
"disableGenerativeAi": {
"type": "boolean",
"description": "Whether generative AI is disabled for this agency"
},
"proServiceFeePercentage": {
"type": "number",
"description": "The effective pro-creator service fee percentage (agency override or system default)"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's relationship-manager email, or null when none is set"
},
"cashRewardServiceFeePercentage": {
"type": "number",
"description": "The effective cash-reward service fee percentage (agency override or system default)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited agency, or null when the name was ambiguous and nothing was edited."
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-agency",
"title": "Edit an agency",
"description": "Edit an agency's profile by id (from list-agencies or list-brands), including its logo. Pass only the fields to change — everything else is left as is. Applies directly, since the web app confirms no agency-profile edit. The platform owns validity: credits, the service-fee percentages, bexio_contact_id, and the disable_intercom / disable_generative_ai flags are admin-only, and referral codes must differ and be unique — any refusal is surfaced as-is. The edited agency is returned in full; currency, bexio_contact_id and filled_out_agency_data are written but not shown back, since the platform's read omits them. This does not change the agency's subscription (use assign-subscription or edit-subscription).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId"
],
"properties": {
"city": {
"type": "string",
"description": "The agency's city."
},
"logo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "A new logo for the agency, given by a local file path (preferred) or a URL. Replaces the current logo. For a pasted logo with no readable path (the hosted server), call request-file-upload with target 'agency-logo'."
},
"name": {
"type": "string",
"description": "The agency's name."
},
"address": {
"type": "string",
"description": "The agency's street address."
},
"country": {
"type": "string",
"description": "The agency's country."
},
"credits": {
"type": "number",
"description": "The agency's credit balance. Admin-only — the platform refuses non-admins."
},
"placeId": {
"type": "string",
"description": "The Google Places id for the agency's address."
},
"website": {
"type": "string",
"description": "The agency's website."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to edit, from list-agencies or list-brands."
},
"currency": {
"type": "string",
"description": "The agency's currency, e.g. CHF. Cascades to its brands. Not shown in the returned agency."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency (one company) rather than a multi-client agency."
},
"postalCode": {
"type": "string",
"description": "The agency's postal code."
},
"salesEmail": {
"type": "string",
"description": "The agency's sales email."
},
"description": {
"type": "string",
"description": "The agency's description."
},
"billingEmail": {
"type": "string",
"description": "The agency's billing email."
},
"referralCode": {
"type": "string",
"description": "The agency's private referral code. Must differ from the public one and be unique — enforced platform-side."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"bexioContactId": {
"type": "string",
"description": "The Bexio contact id. Admin-only — the platform refuses non-admins."
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency may hold more than one brand."
},
"disableIntercom": {
"type": "boolean",
"description": "Whether to disable Intercom for the agency. Admin-only — the platform refuses non-admins."
},
"placeDescription": {
"type": "string",
"description": "The Google Places description for the agency's address."
},
"referralCodePublic": {
"type": "string",
"description": "The agency's public referral code. Must differ from the private one and be unique — enforced platform-side."
},
"disableGenerativeAi": {
"type": "boolean",
"description": "Whether to disable generative AI for the agency. Admin-only — the platform refuses non-admins."
},
"filledOutAgencyData": {
"type": "boolean",
"description": "Whether the agency's onboarding data is complete. Not shown in the returned agency."
},
"proServiceFeePercentage": {
"type": "number",
"description": "The pro-creator service fee percentage. Admin-only — the platform refuses non-admins."
},
"relationshipManagerEmail": {
"type": "string",
"description": "The agency's relationship-manager email."
},
"cashRewardServiceFeePercentage": {
"type": "number",
"description": "The cash-reward service fee percentage. Admin-only — the platform refuses non-admins."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"changed"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"address",
"billingEmail",
"cashRewardServiceFeePercentage",
"city",
"country",
"created",
"credits",
"description",
"disableGenerativeAi",
"disableIntercom",
"futureSubscription",
"id",
"largeBrand",
"logoUrl",
"multipleBrands",
"name",
"ownerId",
"placeDescription",
"placeId",
"postalCode",
"proServiceFeePercentage",
"referralCode",
"referralCodePublic",
"relationshipManagerEmail",
"salesEmail",
"subscription",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"url": {
"type": "string",
"description": "The agency's page in the Refluenced web app"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is set"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's street address, or null when none is set"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is set"
},
"created": {
"type": "string",
"description": "When the agency was created (ISO 8601)"
},
"credits": {
"type": "number",
"description": "The agency's credit balance"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the agency's logo image, or null when none is set"
},
"ownerId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of the agency's owner, or null when unknown"
},
"placeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places id for the address, or null"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is set"
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"postalCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's postal code, or null when none is set"
},
"salesEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's sales email, or null when none is set"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's description, or null when none is set"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null when none is set"
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's active subscription — the plan every brand under it runs on — or null when it has none"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency may hold more than one brand"
},
"disableIntercom": {
"type": "boolean",
"description": "Whether Intercom is disabled for this agency"
},
"placeDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places description for the address, or null"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's public referral code, or null when none is set"
},
"disableGenerativeAi": {
"type": "boolean",
"description": "Whether generative AI is disabled for this agency"
},
"proServiceFeePercentage": {
"type": "number",
"description": "The effective pro-creator service fee percentage (agency override or system default)"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's relationship-manager email, or null when none is set"
},
"cashRewardServiceFeePercentage": {
"type": "number",
"description": "The effective cash-reward service fee percentage (agency override or system default)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited agency, or null when the name was ambiguous and nothing was edited."
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Edit a brand's profile by id (from list-brands, get-brand, list-campaigns or search-campaigns), including its logo. Pass only the fields to change — everything else is left as is. Applies directly, since the web app confirms no brand-profile edit. Setting interests replaces the whole set. The platform owns validity: some fields are admin-only (ppc, ppr, bexio_contact_id) and referral codes must differ and be unique — any refusal is surfaced as-is. The edited brand is returned in full. This does not change the brand's subscription (use assign-subscription or edit-subscription).
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressCity
The brand's city.
Clear enough to supply this argument.
addressPostal
The brand's postal code.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressStreet
The brand's street address.
Clear enough to supply this argument.
bexioContactId
The Bexio contact id. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
bio
The brand's short bio.
Clear enough to supply this argument.
branchesData
The brand's branches/industry data.
Explain the meaning of this value, not just its name.
brandId
The id of the brand to edit, from list-brands, get-brand, list-campaigns or search-campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyOverview
The brand's company overview text.
Clear enough to supply this argument.
country
The brand's country.
Clear enough to supply this argument.
customerPainPoints
The brand's customer pain points text.
Clear enough to supply this argument.
disableChatClose
Whether to disable closing chats for this brand.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
eventCreator
Whether the brand is an event creator.
Clear enough to supply this argument.
instagramUsername
The brand's Instagram handle (without the @).
Clear enough to supply this argument.
interests
The interest category ids to set on the brand — replaces the current set. Ids come from list-interests or get-brand.
Clear enough to supply this argument.
logo › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Clear enough to supply this argument.
logo › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Clear enough to supply this argument.
logo › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Clear enough to supply this argument.
logo › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Clear enough to supply this argument.
name
The brand's name (company_name).
Clear enough to supply this argument.
phonenumber
The brand's phone number.
Clear enough to supply this argument.
placeDescription
The Google Places description for the brand's address.
Clear enough to supply this argument.
placeId
The Google Places id for the brand's address.
Clear enough to supply this argument.
ppc
Price per click, in the brand's currency. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
ppr
Price per result, in the brand's currency. Admin-only — the platform refuses non-admins.
Clear enough to supply this argument.
productsOverview
The brand's products overview text.
Clear enough to supply this argument.
referralCode
The brand's private referral code. Must differ from the public one and be unique — the platform enforces both.
Clear enough to supply this argument.
referralCodePublic
The brand's public referral code. Must differ from the private one and be unique — the platform enforces both.
Clear enough to supply this argument.
refluencedTagRequired
Whether creators must include the Refluenced tag.
Clear enough to supply this argument.
skipCharacterLimits
Whether the brand's campaigns may skip character limits.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"changed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited brand, or null when the name was ambiguous and nothing was edited."
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-brand",
"title": "Edit a brand",
"description": "Edit a brand's profile by id (from list-brands, get-brand, list-campaigns or search-campaigns), including its logo. Pass only the fields to change — everything else is left as is. Applies directly, since the web app confirms no brand-profile edit. Setting interests replaces the whole set. The platform owns validity: some fields are admin-only (ppc, ppr, bexio_contact_id) and referral codes must differ and be unique — any refusal is surfaced as-is. The edited brand is returned in full. This does not change the brand's subscription (use assign-subscription or edit-subscription).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId"
],
"properties": {
"bio": {
"type": "string",
"description": "The brand's short bio."
},
"ppc": {
"type": "number",
"description": "Price per click, in the brand's currency. Admin-only — the platform refuses non-admins."
},
"ppr": {
"type": "number",
"description": "Price per result, in the brand's currency. Admin-only — the platform refuses non-admins."
},
"logo": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "A new logo for the brand, given by a local file path (preferred) or a URL. Replaces the current logo. For a pasted logo with no readable path (the hosted server), call request-file-upload with target 'brand-logo'."
},
"name": {
"type": "string",
"description": "The brand's name (company_name)."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to edit, from list-brands, get-brand, list-campaigns or search-campaigns."
},
"country": {
"type": "string",
"description": "The brand's country."
},
"placeId": {
"type": "string",
"description": "The Google Places id for the brand's address."
},
"website": {
"type": "string",
"description": "The brand's website."
},
"interests": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "The interest category ids to set on the brand — replaces the current set. Ids come from list-interests or get-brand."
},
"addressCity": {
"type": "string",
"description": "The brand's city."
},
"phonenumber": {
"type": "string",
"description": "The brand's phone number."
},
"branchesData": {
"type": "string",
"description": "The brand's branches/industry data."
},
"eventCreator": {
"type": "boolean",
"description": "Whether the brand is an event creator."
},
"referralCode": {
"type": "string",
"description": "The brand's private referral code. Must differ from the public one and be unique — the platform enforces both."
},
"addressPostal": {
"type": "string",
"description": "The brand's postal code."
},
"addressStreet": {
"type": "string",
"description": "The brand's street address."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"bexioContactId": {
"type": "string",
"description": "The Bexio contact id. Admin-only — the platform refuses non-admins."
},
"tiktokUsername": {
"type": "string",
"description": "The brand's TikTok handle (without the @)."
},
"companyOverview": {
"type": "string",
"description": "The brand's company overview text."
},
"disableChatClose": {
"type": "boolean",
"description": "Whether to disable closing chats for this brand."
},
"placeDescription": {
"type": "string",
"description": "The Google Places description for the brand's address."
},
"productsOverview": {
"type": "string",
"description": "The brand's products overview text."
},
"instagramUsername": {
"type": "string",
"description": "The brand's Instagram handle (without the @)."
},
"customerPainPoints": {
"type": "string",
"description": "The brand's customer pain points text."
},
"referralCodePublic": {
"type": "string",
"description": "The brand's public referral code. Must differ from the private one and be unique — the platform enforces both."
},
"skipCharacterLimits": {
"type": "boolean",
"description": "Whether the brand's campaigns may skip character limits."
},
"refluencedTagRequired": {
"type": "boolean",
"description": "Whether creators must include the Refluenced tag."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"changed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited brand, or null when the name was ambiguous and nothing was edited."
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Edit an existing campaign, changing only the fields you pass — every field is optional and untouched fields are left as they are. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Editing a draft changes nothing outward, so it applies directly. Editing a LIVE campaign is preview-then-confirm: by default it performs no write and returns a preview naming the brand and summarizing the changes for you to confirm with the user; call again with confirm: true to apply them. What may be edited on a live campaign is the platform's decision — the change is sent and any refusal is surfaced as-is. Publishing a draft is a separate step, not part of editing.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
accountTags
Accounts each influencer must tag in their content, without the leading @.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
aiRecommendations
Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on.
Resolve the mismatch between this description and its schema constraints.
bonusPool
Whether a bonus pool applies to the campaign.
Clear enough to supply this argument.
brandDoes
The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published.
Clear enough to supply this argument.
brandName
The brand name shown on the campaign, or null to clear it.
Clear enough to supply this argument.
campaignLocations › items › city
The location's city.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › country
The location's country.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › description
A human-readable description of the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › placeId
The Google Place id identifying the location.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › postal
The location's postal code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignLocations › items › street
The location's street.
Clear enough to supply this argument.
campaignSize
How many influencers the campaign is sized for. Subject to the account's subscription.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cashReward
Cash paid per influencer, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
castingStart
When casting opens, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
commercialDays
How many days influencers have to post their content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
communityCodes
Whether the campaign uses community (discount) codes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
completed
When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
contentApprovalMode
How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
contentLanguage
The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
deadline
The application deadline, as an ISO 8601 datetime, or null to leave unset.
Clear enough to supply this argument.
digitalShopUrl
The shop URL influencers link to, or null when there is none.
Clear enough to supply this argument.
dontsDescription
What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation.
Clear enough to supply this argument.
event
Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset.
Clear enough to supply this argument.
eventAddressCity
The event's city. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressCountry
The event's country. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressDescription
A description of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPlaceId
The Google Place id of the event location. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressPostal
The event's postal code. Only applies to event campaigns.
Clear enough to supply this argument.
eventAddressStreet
The event's street address. Only applies to event campaigns.
Clear enough to supply this argument.
eventAttendedByInfluencer
Whether the influencer attends the event in person. Only applies to event campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
eventEnd
When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns.
Clear enough to supply this argument.
eventStart
When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
hashtags
Hashtags each influencer must use, without the leading #.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
highlyRatedReward
Extra reward paid to highly rated influencers, in the account's currency.
Clear enough to supply this argument.
includeStoriesInReview
Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise.
Clear enough to supply this argument.
instagram
Whether the campaign runs on Instagram.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagramBrandedContentAds
Whether the campaign enables Instagram branded-content (partnership) ads.
Clear enough to supply this argument.
linkSticker
The URL for an Instagram story link sticker, or null when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
linkStickerTitle
The title shown on the Instagram story link sticker, or null when there is none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
locations
The locations the campaign targets, e.g. ["Schweiz"] or several regions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
longDescription
The full campaign brief, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
manualScheduling
Whether content scheduling is set manually rather than automatically by the platform.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfFeedposts
Feed posts required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfReels
Reels required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfStories
Stories required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
numberOfUgc
UGC videos required per influencer.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
onGoing
Whether the campaign runs on an ongoing basis rather than a fixed window.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnership
Whether posts are labelled as paid partnerships.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
paidPartnershipWith
The account a paid partnership names, or null when none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
performanceReward
Extra reward tied to performance, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preparation
When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preparationDays
How many days influencers have to prepare.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForBrands
Whether the campaign is hidden from other brands.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
privateForInfluencers
Whether the campaign is private — reachable only by invitation, not shown in the public feed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
proInfluencer
Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
productVariant
The product variants offered (e.g. sizes or colours), or null when there are none.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
revisions
Revisions allowed on delivered content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sellingPrice
The product's selling price, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceIsClothing
Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
serviceType
What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sourceMaterial
Whether creators must supply the raw source footage. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
speedyReward
Extra reward paid for fast delivery, in the account's currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
subtitles
Whether the UGC videos must include subtitles. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
task
The task influencers must complete, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktok
Whether the campaign runs on TikTok. Cannot be combined with UGC.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokAccountTags
The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokHashtags
The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › country
The ISO-2 country for the keyword plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › existingKeywordIds
Ids of already-tracked TikTok keywords to target.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › isInitialized
Whether the keyword plan has been initialized.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › newKeywords
New keyword strings to add to the plan.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokKeywordPlan › websiteUrl
A website URL used to seed keyword suggestions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokNumberOfMedias
TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokSparkAds
Whether the campaign enables TikTok Spark Ads.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The campaign's title.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
typeOfCooperation
A free-text description of the cooperation type, or null to clear it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugc
Whether the campaign is a UGC campaign. Cannot be combined with TikTok.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ugcExtraCashReward
Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
usesStructuredProductVariants
Whether productVariant is parsed as structured, one-per-line variants rather than free text.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › mimeType
The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › name
The file name, e.g. brief.pdf — how the asset is labelled.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › path
An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
assets › items › url
A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign to edit, from list-campaigns, search-campaigns or get-campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
image › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › base64
The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › mimeType
The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › path
An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
images › items › url
A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-campaign",
"title": "Edit a campaign",
"description": "Edit an existing campaign, changing only the fields you pass — every field is optional and untouched fields are left as they are. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Editing a draft changes nothing outward, so it applies directly. Editing a LIVE campaign is preview-then-confirm: by default it performs no write and returns a preview naming the brand and summarizing the changes for you to confirm with the user; call again with confirm: true to apply them. What may be edited on a live campaign is the platform's decision — the change is sent and any refusal is surfaced as-is. Publishing a draft is a separate step, not part of editing.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign. Cannot be combined with TikTok."
},
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null to clear it."
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event. An event campaign's schedule is built from its event dates, so when creating one, ask the user for the event start and end dates (eventStart/eventEnd) and set them — do not leave them unset."
},
"image": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
},
"description": "A new main image, given by a local file path (preferred) or a URL — see the path/url fields for how to supply a pasted image."
},
"title": {
"type": "string",
"minLength": 1,
"description": "The campaign's title."
},
"assets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A URL the server fetches the file from. With neither a path nor a URL — e.g. a pasted file on the hosted server, which has no path this server can read — call request-file-upload for a link the user uploads through."
},
"name": {
"type": "string",
"description": "The file name, e.g. brief.pdf — how the asset is labelled."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly. This is the preferred way to upload a file the user has on disk OR pasted/dragged into the conversation — pass the file's path here (a pasted file is saved to a temp path). Do NOT base64-encode the file yourself."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf. Inferred from path/url when omitted."
}
}
},
"description": "Brief documents, videos or other assets to attach, each given by a local file path (preferred) or a URL."
},
"images": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the image from — use this when the image is already online. If you have neither a readable path nor a public URL (the normal case for a pasted, dragged or attached image on the hosted server), do not guess a path or base64 the bytes: call request-file-upload for a one-time link the user uploads the image through."
},
"path": {
"type": "string",
"description": "An absolute path to a local image file the server reads directly — the preferred source whenever the server can see the file. Running locally in Claude Code, a pasted or dragged image is saved to a readable temp path, so pass that path here. On the hosted server (Claude Desktop/web) a pasted image lives in a sandbox this server cannot read, so its path will fail — use request-file-upload there instead. Never base64-encode the image yourself."
},
"base64": {
"type": "string",
"description": "The image's bytes, base64-encoded. A last resort for tiny images only — prefer path or url. Never base64 a pasted image on the hosted server; use request-file-upload instead."
},
"mimeType": {
"type": "string",
"description": "The image's MIME type, e.g. image/png. Inferred from path/url when omitted; defaults to image/jpeg."
}
}
},
"description": "Additional product images to add, each given by a local file path (preferred) or a URL. Typically up to 5."
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok. Cannot be combined with UGC."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign runs on an ongoing basis rather than a fixed window."
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline, as an ISO 8601 datetime, or null to leave unset."
},
"eventEnd": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event ends, as an ISO 8601 datetime. Required for an event campaign — ask the user for it; only applies to event campaigns."
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags each influencer must use, without the leading #."
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies to the campaign."
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, shown to influencers on the campaign brief. Required before a campaign can be published."
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name shown on the campaign, or null to clear it."
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete, as an ISO 8601 datetime, or null to leave unset."
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets, e.g. [\"Schweiz\"] or several regions."
},
"revisions": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Revisions allowed on delivered content."
},
"subtitles": {
"type": "boolean",
"description": "Whether the UGC videos must include subtitles. Only applies to UGC campaigns."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to edit, from list-campaigns, search-campaigns or get-campaign."
},
"cashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Cash paid per influencer, in the account's currency."
},
"eventStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the event starts, as an ISO 8601 datetime. Required for an event campaign (its schedule is derived from this) — ask the user for it; only applies to event campaigns."
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts each influencer must tag in their content, without the leading @."
},
"linkSticker": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The URL for an Instagram story link sticker, or null when there is none."
},
"numberOfUgc": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "UGC videos required per influencer."
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends, as an ISO 8601 datetime. Normally derived from the deadline and preparation days; the frontend needs it populated, so create sets it."
},
"serviceType": {
"enum": [
"cash",
"physical_product",
"voucher"
],
"type": "string",
"description": "What the influencer receives: a physical product, a voucher, or cash. Exactly one applies; it determines the campaign's reward type."
},
"campaignSize": {
"enum": [
"5-10",
"10-15",
"20+"
],
"type": "string",
"description": "How many influencers the campaign is sized for. Subject to the account's subscription."
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens, as an ISO 8601 datetime, or null to leave unset."
},
"sellingPrice": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "The product's selling price, in the account's currency."
},
"speedyReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid for fast delivery, in the account's currency."
},
"numberOfReels": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Reels required per influencer."
},
"proInfluencer": {
"type": "boolean",
"description": "Whether pro influencers can also apply. This opens the campaign to pro influencers in addition to regular creators — it does not restrict the pool to pro only; regular creators can always apply."
},
"commercialDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to post their content."
},
"communityCodes": {
"type": "boolean",
"description": "Whether the campaign uses community (discount) codes."
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null when there is none."
},
"productVariant": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product variants offered (e.g. sizes or colours), or null when there are none."
},
"sourceMaterial": {
"type": "boolean",
"description": "Whether creators must supply the raw source footage. Only applies to UGC campaigns."
},
"tiktokHashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The hashtags for the TikTok side of a combined Instagram-and-TikTok campaign, without the leading #. Only for combined campaigns — Instagram's hashtags go in hashtags; a single-channel TikTok campaign uses hashtags too."
},
"tiktokSparkAds": {
"type": "boolean",
"description": "Whether the campaign enables TikTok Spark Ads."
},
"contentLanguage": {
"enum": [
"English",
"French",
"High German",
"Italian",
"Swiss German"
],
"type": "string",
"description": "The language the UGC videos must be in. Only applies to UGC campaigns; defaults to Swiss German."
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null to clear it."
},
"numberOfStories": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Stories required per influencer."
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships."
},
"preparationDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "How many days influencers have to prepare."
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do, shown on the campaign brief — the Don'ts field, for any campaign type (Instagram, TikTok or UGC), or null when there is none. Written to both the canonical donts_description and the legacy ugc_dont_description so the brief, the display and the AI content-approval evaluator all agree, mirroring AI campaign creation."
},
"eventAddressCity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's city. Only applies to event campaigns."
},
"linkStickerTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The title shown on the Instagram story link sticker, or null when there is none."
},
"manualScheduling": {
"type": "boolean",
"description": "Whether content scheduling is set manually rather than automatically by the platform."
},
"privateForBrands": {
"type": "boolean",
"description": "Whether the campaign is hidden from other brands."
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations on a manual-review campaign. The AI review modes always force this on."
},
"campaignLocations": {
"type": "array",
"items": {
"type": "object",
"required": [
"placeId"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's city."
},
"postal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's postal code."
},
"street": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's street."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The location's country."
},
"placeId": {
"type": "string",
"description": "The Google Place id identifying the location."
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A human-readable description of the location."
}
}
},
"description": "The geocoded target locations, each keyed by a Google Place id. The precise counterpart to locations; use locations for a simple region name when a Place id is not available."
},
"highlyRatedReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward paid to highly rated influencers, in the account's currency."
},
"numberOfFeedposts": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Feed posts required per influencer."
},
"performanceReward": {
"type": "number",
"minimum": 0,
"description": "Extra reward tied to performance, in the account's currency."
},
"serviceIsClothing": {
"type": "boolean",
"description": "Whether the product is clothing (which asks influencers for sizing). A modifier on a physical product."
},
"tiktokAccountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "The accounts to tag on the TikTok side of a combined Instagram-and-TikTok campaign, without the leading @. Only for combined campaigns — Instagram's tags go in accountTags; a single-channel TikTok campaign uses accountTags too."
},
"tiktokKeywordPlan": {
"type": "object",
"properties": {
"country": {
"type": "string",
"description": "The ISO-2 country for the keyword plan."
},
"websiteUrl": {
"type": "string",
"description": "A website URL used to seed keyword suggestions."
},
"newKeywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "New keyword strings to add to the plan."
},
"isInitialized": {
"type": "boolean",
"description": "Whether the keyword plan has been initialized."
},
"existingKeywordIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ids of already-tracked TikTok keywords to target."
}
},
"description": "The TikTok keyword-targeting plan. Only applies to TikTok campaigns."
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A free-text description of the cooperation type, or null to clear it."
},
"eventAddressPostal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's postal code. Only applies to event campaigns."
},
"eventAddressStreet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's street address. Only applies to event campaigns."
},
"ugcExtraCashReward": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Extra cash reward specific to UGC videos, in the account's currency. Only applies to UGC campaigns."
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How submitted content is reviewed before it goes live. 'off' — no review, content syncs as posted. 'manual' — the brand reviews posts/reels/videos (stories sync freely). 'ai_automated' — the AI approves passing content and rejects failing content, no brand step. 'semi_automated' — the AI rejects failing content and the brand approves what passes. The AI modes need the brand's subscription to include content approval and enough cash reward, both enforced platform-side."
},
"eventAddressCountry": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The event's country. Only applies to event campaigns."
},
"eventAddressPlaceId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Place id of the event location. Only applies to event campaigns."
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account a paid partnership names, or null when none."
},
"tiktokNumberOfMedias": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "TikTok videos required per influencer. This is the TikTok deliverable, distinct from reels and posts."
},
"privateForInfluencers": {
"type": "boolean",
"description": "Whether the campaign is private — reachable only by invitation, not shown in the public feed."
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too. Only takes effect under the AI review modes (ai_automated/semi_automated) on an Instagram campaign that requires stories; the platform forces it off otherwise."
},
"eventAddressDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A description of the event location. Only applies to event campaigns."
},
"eventAttendedByInfluencer": {
"type": "boolean",
"description": "Whether the influencer attends the event in person. Only applies to event campaigns."
},
"instagramBrandedContentAds": {
"type": "boolean",
"description": "Whether the campaign enables Instagram branded-content (partnership) ads."
},
"usesStructuredProductVariants": {
"type": "boolean",
"description": "Whether productVariant is parsed as structured, one-per-line variants rather than free text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Adjust which members of an already-attached group will be invited to a DRAFT campaign: add members to the invite's subset, remove members from it, or both. The group must already be attached with invite-group-to-draft-campaign (the platform refuses group_invite_not_found otherwise), and adding requires the campaign to still be a draft (campaign_not_draft). Applies directly. To detach the group entirely use remove-group-from-draft-campaign.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
addInfluencerUuids
Influencer profile ids (from search-influencer-network or list-group-influencers — not the BaseUser id) to add to the invite's subset; they must already be members of the group. Draft-only.
Clear enough to supply this argument.
campaignId
The id of the draft campaign the group is attached to.
Clear enough to supply this argument.
groupId
The id of the attached group, from list-campaign-invited-groups.
Clear enough to supply this argument.
removeInfluencerUuids
Influencer profile ids (from list-group-influencers — not the BaseUser id) to remove from the invite's subset.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"added",
"campaignId",
"errors",
"groupId",
"removed"
],
"properties": {
"added": {
"type": "array",
"items": {
"type": "number"
},
"description": "The uuids added to the invite's subset (empty if the add step failed or none)"
},
"errors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any refusals from the add or remove step, surfaced as-is"
},
"groupId": {
"type": "number",
"description": "The attached group"
},
"removed": {
"type": "array",
"items": {
"type": "number"
},
"description": "The uuids removed from the invite's subset"
},
"campaignId": {
"type": "number",
"description": "The draft campaign"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-draft-campaign-group-invite",
"title": "Adjust an attached group's invited members",
"description": "Adjust which members of an already-attached group will be invited to a DRAFT campaign: add members to the invite's subset, remove members from it, or both. The group must already be attached with invite-group-to-draft-campaign (the platform refuses group_invite_not_found otherwise), and adding requires the campaign to still be a draft (campaign_not_draft). Applies directly. To detach the group entirely use remove-group-from-draft-campaign.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the attached group, from list-campaign-invited-groups."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the draft campaign the group is attached to."
},
"addInfluencerUuids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "Influencer profile ids (from search-influencer-network or list-group-influencers — not the BaseUser id) to add to the invite's subset; they must already be members of the group. Draft-only."
},
"removeInfluencerUuids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "Influencer profile ids (from list-group-influencers — not the BaseUser id) to remove from the invite's subset."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"added",
"campaignId",
"errors",
"groupId",
"removed"
],
"properties": {
"added": {
"type": "array",
"items": {
"type": "number"
},
"description": "The uuids added to the invite's subset (empty if the add step failed or none)"
},
"errors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any refusals from the add or remove step, surfaced as-is"
},
"groupId": {
"type": "number",
"description": "The attached group"
},
"removed": {
"type": "array",
"items": {
"type": "number"
},
"description": "The uuids removed from the invite's subset"
},
"campaignId": {
"type": "number",
"description": "The draft campaign"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Rename a saved influencer-filter preset and/or replace its filter set. Pass name to rename; pass any of the filter fields (followers, engagement, median views, countries, gender, interests, channel, vibe) to replace the whole stored filter set with those — the filters are not merged, so pass the full set you want. Target it by presetId (from list-filter-presets); no scope is needed, the platform resolves the owner from the preset. Applies directly. The platform refuses a duplicate filter set (duplicate_filter_params), surfaced as-is.
Describe the returned information so the agent knows whether it will answer the request.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
A new name for the preset. Omit to leave it unchanged.
Clear enough to supply this argument.
presetId
The id of the preset to edit, from list-filter-presets.
Clear enough to supply this argument.
channel
Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel.
Clear enough to supply this argument.
countries
Only members based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set.
Clear enough to supply this argument.
engagementMax
Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
engagementMin
Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
followersMax
Only members with at most this many followers.
Clear enough to supply this argument.
followersMin
Only members with at least this many followers.
Clear enough to supply this argument.
gender
Only members of this gender.
Clear enough to supply this argument.
interests
Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests).
Clear enough to supply this argument.
medianViewsMax
Only members with at most this many median views.
Clear enough to supply this argument.
medianViewsMin
Only members with at least this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Clear enough to supply this argument.
punishmentType
Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins.
Clear enough to supply this argument.
search
Filter members by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"filterParams",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset that was edited"
},
"name": {
"type": "string",
"description": "The preset's name after the edit"
},
"filterParams": {
"type": "object",
"description": "The preset's filter set after the edit, as the platform's stored search params",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-filter-preset",
"title": "Edit a saved filter preset",
"description": "Rename a saved influencer-filter preset and/or replace its filter set. Pass name to rename; pass any of the filter fields (followers, engagement, median views, countries, gender, interests, channel, vibe) to replace the whole stored filter set with those — the filters are not merged, so pass the full set you want. Target it by presetId (from list-filter-presets); no scope is needed, the platform resolves the owner from the preset. Applies directly. The platform refuses a duplicate filter set (duplicate_filter_params), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"presetId"
],
"properties": {
"name": {
"type": "string",
"description": "A new name for the preset. Omit to leave it unchanged."
},
"vibe": {
"type": "string",
"description": "Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only members of this gender."
},
"search": {
"type": "string",
"description": "Filter members by name, Instagram handle or TikTok handle."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"presetId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the preset to edit, from list-filter-presets."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests)."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many followers."
},
"engagementMax": {
"type": "number",
"description": "Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"engagementMin": {
"type": "number",
"description": "Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"filterParams",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset that was edited"
},
"name": {
"type": "string",
"description": "The preset's name after the edit"
},
"filterParams": {
"type": "object",
"description": "The preset's filter set after the edit, as the platform's stored search params",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Edit an influencer group's name and/or description by id (from list-groups). Pass only what changes. The name must stay unique within the owning brand or agency (the platform refuses group_with_this_name_already_exists), and smart groups cannot be renamed. Applies directly, as the web app saves directly. Only a brand or agency member with write access may edit; a refusal is surfaced as it stands.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
description
A new description for the group; pass an empty string to clear it. Omit to leave it unchanged.
Clear enough to supply this argument.
groupId
The id of the group to edit, from list-groups.
Clear enough to supply this argument.
name
A new name for the group. Omit to leave it unchanged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"description",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group that was edited"
},
"name": {
"type": "string",
"description": "The group's name after the edit"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description after the edit, or null when unset"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-group",
"title": "Edit an influencer group",
"description": "Edit an influencer group's name and/or description by id (from list-groups). Pass only what changes. The name must stay unique within the owning brand or agency (the platform refuses group_with_this_name_already_exists), and smart groups cannot be renamed. Applies directly, as the web app saves directly. Only a brand or agency member with write access may edit; a refusal is surfaced as it stands.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"name": {
"type": "string",
"description": "A new name for the group. Omit to leave it unchanged."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to edit, from list-groups."
},
"description": {
"type": "string",
"description": "A new description for the group; pass an empty string to clear it. Omit to leave it unchanged."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"description",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group that was edited"
},
"name": {
"type": "string",
"description": "The group's name after the edit"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description after the edit, or null when unset"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Edit a creator's profile record by their influencer id — the clothing sizes (top, below, shoe size, personal style) and the audience-insight shares (gender split, top three cities and countries with their shares, and the 18–24 / 25–34 / 35–44 age-band shares), the same fields the edit page's Clothing and Insights groups save. Pass only the fields to change; everything else is left as is. Applies directly, as the web app saves these with no confirmation. NOTE: the audience-insight shares are a SEPARATE representation from the audience-demographics charts get-influencer shows — those charts read the platform's insight-sync JSON graphs, which this edit cannot write, so edits here will NOT appear in get-influencer's demographics (nor on the profile page's charts). What they do drive is the profile's completeness percentage and audience matching; the demographics charts are populated only by the Instagram/TikTok insight sync. Does NOT change follower/engagement figures (use update-influencer-instagram) or account details like name and contact (use edit-influencer-account). The platform owns validity and permits the edit only to an admin or the creator themselves — any refusal is surfaced as-is. The edited profile is returned in full.
The description explains the capability, when to use it, and what to expect.
Inputs76/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agegroup1Share
Audience share aged 18–24, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agegroup2Share
Audience share aged 25–34, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agegroup3Share
Audience share aged 35–44, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
below
Clothing size — bottoms.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city1Name
Top audience city #1 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city1Share
Top audience city #1 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city2Name
Top audience city #2 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city2Share
Top audience city #2 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city3Name
Top audience city #3 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city3Share
Top audience city #3 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country1Name
Top audience country #1 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country1Share
Top audience country #1 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country2Name
Top audience country #2 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country2Share
Top audience country #2 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country3Name
Top audience country #3 name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
country3Share
Top audience country #3 share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
femaleRatio
Female audience share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencerId
The influencer profile id to edit, from search-influencer-network or get-influencer.
Clear enough to supply this argument.
maleRatio
Male audience share, as a percentage.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personalStyle
The creator's personal-style note.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
shoeSize
Clothing size — shoes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
top
Clothing size — tops.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Edit a creator's personal account details by their userId (from get-influencer or search-influencer-network) — name, email, phone number, postal address, country, sex/gender, date of birth, and bio, the edit page's Account group. These live on the user record (PATCH /api/users/{userId}/), a different endpoint and id from the profile edits in edit-influencer. Pass only the fields to change. Applies directly, as the web app saves these with no confirmation. The platform owns validity and permits the edit only to an admin or the creator themselves — any refusal (e.g. an email already in use) is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressCity
The creator's city.
Clear enough to supply this argument.
addressPostal
The creator's postal code.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
addressStreet
The creator's street (without the house number).
Clear enough to supply this argument.
addressStreetNumber
The creator's house/street number.
Clear enough to supply this argument.
bio
The creator's bio (aboutme).
Clear enough to supply this argument.
country
The creator's country, e.g. 'Switzerland'.
Clear enough to supply this argument.
dateOfBirth
Date of birth as YYYY-MM-DD.
Clear enough to supply this argument.
email
The creator's email address.
Clear enough to supply this argument.
firstName
The creator's first name.
Clear enough to supply this argument.
lastName
The creator's last name.
Clear enough to supply this argument.
phonenumber
The creator's phone number, in international format.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
sex
The creator's stated sex/gender (the web app offers Weiblich, Männlich, diverse, Keine Angabe).
Clear enough to supply this argument.
userId
The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId. Account details key on the user record, not the profile.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"account",
"changed"
],
"properties": {
"account": {
"type": "object",
"required": [
"addressCity",
"addressPostal",
"addressStreet",
"addressStreetNumber",
"bio",
"country",
"dateOfBirth",
"email",
"firstName",
"lastName",
"phonenumber",
"sex",
"userId"
],
"properties": {
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's bio (aboutme), or null"
},
"sex": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's stated sex/gender, or null"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's email address, or null"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"addressCity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"dateOfBirth": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Date of birth as YYYY-MM-DD — echoes the value just set, or null when it was not part of this edit"
},
"phonenumber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's phone number, or null"
},
"addressPostal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's postal code, or null"
},
"addressStreet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's street, or null"
},
"addressStreetNumber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's house/street number, or null"
}
},
"description": "The creator's account details after the edit",
"additionalProperties": false
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-influencer-account",
"title": "Edit an influencer's account details",
"description": "Edit a creator's personal account details by their userId (from get-influencer or search-influencer-network) — name, email, phone number, postal address, country, sex/gender, date of birth, and bio, the edit page's Account group. These live on the user record (PATCH /api/users/{userId}/), a different endpoint and id from the profile edits in edit-influencer. Pass only the fields to change. Applies directly, as the web app saves these with no confirmation. The platform owns validity and permits the edit only to an admin or the creator themselves — any refusal (e.g. an email already in use) is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"userId"
],
"properties": {
"bio": {
"type": "string",
"description": "The creator's bio (aboutme)."
},
"sex": {
"type": "string",
"description": "The creator's stated sex/gender (the web app offers Weiblich, Männlich, diverse, Keine Angabe)."
},
"email": {
"type": "string",
"description": "The creator's email address."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId. Account details key on the user record, not the profile."
},
"country": {
"type": "string",
"description": "The creator's country, e.g. 'Switzerland'."
},
"lastName": {
"type": "string",
"description": "The creator's last name."
},
"firstName": {
"type": "string",
"description": "The creator's first name."
},
"addressCity": {
"type": "string",
"description": "The creator's city."
},
"dateOfBirth": {
"type": "string",
"description": "Date of birth as YYYY-MM-DD."
},
"phonenumber": {
"type": "string",
"description": "The creator's phone number, in international format."
},
"addressPostal": {
"type": "string",
"description": "The creator's postal code."
},
"addressStreet": {
"type": "string",
"description": "The creator's street (without the house number)."
},
"addressStreetNumber": {
"type": "string",
"description": "The creator's house/street number."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"account",
"changed"
],
"properties": {
"account": {
"type": "object",
"required": [
"addressCity",
"addressPostal",
"addressStreet",
"addressStreetNumber",
"bio",
"country",
"dateOfBirth",
"email",
"firstName",
"lastName",
"phonenumber",
"sex",
"userId"
],
"properties": {
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's bio (aboutme), or null"
},
"sex": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's stated sex/gender, or null"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's email address, or null"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"addressCity": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"dateOfBirth": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Date of birth as YYYY-MM-DD — echoes the value just set, or null when it was not part of this edit"
},
"phonenumber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's phone number, or null"
},
"addressPostal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's postal code, or null"
},
"addressStreet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's street, or null"
},
"addressStreetNumber": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's house/street number, or null"
}
},
"description": "The creator's account details after the edit",
"additionalProperties": false
},
"changed": {
"type": "array",
"items": {
"type": "string"
},
"description": "The fields that were changed by this edit"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Edit an existing punishment (discipline) — change its reason, reset how many days it has left, switch its re-verification setting, or its reason template. This is outward-facing (a visible punishment notifies the creator on change), so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. Provide only the fields you want to change. Admin-only; any platform refusal (e.g. a negative daysLeft or a template type mismatch) is surfaced as-is.
Resolve contradictions between the description, input schema, and annotations.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bodyDe
A new German reason body. Provide to change it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bodyEn
A new English reason body. Provide to change it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
creatorName
The creator's name or handle, to name them in the confirmation. Optional.
Explain what happens when this optional value is omitted.
daysLeft
Reset the expiry to this many days from now; 0 expires it immediately.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentId
The id of the punishment to edit, from list-punishments or get-punishment.
Clear enough to supply this argument.
reVerificationAllowed
Un-verify family: whether the creator may re-verify. Provide to change it.
Clear enough to supply this argument.
templateId
Switch to this reason template by id (from list-punishment-templates); its type must match.
Clear enough to supply this argument.
titleDe
A new German reason title. Provide to change it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
titleEn
A new English reason title. Provide to change it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the edit was applied"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment, re-read after editing; on a preview it shows the current state that would change"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-punishment",
"title": "Edit an active punishment",
"description": "Edit an existing punishment (discipline) — change its reason, reset how many days it has left, switch its re-verification setting, or its reason template. This is outward-facing (a visible punishment notifies the creator on change), so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. Provide only the fields you want to change. Admin-only; any platform refusal (e.g. a negative daysLeft or a template type mismatch) is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishmentId"
],
"properties": {
"bodyDe": {
"type": "string",
"minLength": 1,
"description": "A new German reason body. Provide to change it."
},
"bodyEn": {
"type": "string",
"minLength": 1,
"description": "A new English reason body. Provide to change it."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"titleDe": {
"type": "string",
"minLength": 1,
"description": "A new German reason title. Provide to change it."
},
"titleEn": {
"type": "string",
"minLength": 1,
"description": "A new English reason title. Provide to change it."
},
"daysLeft": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Reset the expiry to this many days from now; 0 expires it immediately."
},
"templateId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Switch to this reason template by id (from list-punishment-templates); its type must match."
},
"creatorName": {
"type": "string",
"description": "The creator's name or handle, to name them in the confirmation. Optional."
},
"punishmentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the punishment to edit, from list-punishments or get-punishment."
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Un-verify family: whether the creator may re-verify. Provide to change it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the edit was applied"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment, re-read after editing; on a preview it shows the current state that would change"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Edit one language's title and body on a punishment reason template, by translation id (from list-punishment-templates). Internal configuration, applied directly (the web app confirms nothing here). Admin-only; any platform refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
body
The reason body text to set for this translation — the language identified by translationId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
title
The reason title to set for this translation — the language identified by translationId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
translationId
The id of the translation to edit — each template lists its per-language translations with ids in list-punishment-templates.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"body",
"performed",
"title",
"translationId"
],
"properties": {
"body": {
"type": "string",
"description": "The reason body that was set"
},
"title": {
"type": "string",
"description": "The reason title that was set"
},
"performed": {
"type": "boolean",
"description": "Whether the translation was updated"
},
"translationId": {
"type": "number",
"description": "The translation that was edited"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-punishment-template",
"title": "Edit a punishment template translation",
"description": "Edit one language's title and body on a punishment reason template, by translation id (from list-punishment-templates). Internal configuration, applied directly (the web app confirms nothing here). Admin-only; any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"body",
"title",
"translationId"
],
"properties": {
"body": {
"type": "string",
"minLength": 1,
"description": "The reason body text to set for this translation — the language identified by translationId."
},
"title": {
"type": "string",
"minLength": 1,
"description": "The reason title to set for this translation — the language identified by translationId."
},
"translationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the translation to edit — each template lists its per-language translations with ids in list-punishment-templates."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"body",
"performed",
"title",
"translationId"
],
"properties": {
"body": {
"type": "string",
"description": "The reason body that was set"
},
"title": {
"type": "string",
"description": "The reason title that was set"
},
"performed": {
"type": "boolean",
"description": "Whether the translation was updated"
},
"translationId": {
"type": "number",
"description": "The translation that was edited"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Edit an agency's existing subscription by id (from get-subscription or get-agency) — the plan's limits, features, prices, validity, seats, and billing period. Pass only the fields to change. Applies directly, as the web app's plan admin does, and is admin-only (the platform refuses otherwise). Changing the currency cascades to the agency and its brands. To create a subscription instead, use assign-subscription; to end one, cancel-subscription.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
accessToInfluencerNetwork
Whether access to the influencer network is on.
Clear enough to supply this argument.
aiAutoApprove
Whether the AI auto-approves content.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
buyout
The buyout allowance.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignBooster
Whether the campaign booster feature is on.
Clear enough to supply this argument.
contentApproval
Whether content approval is on.
Explain the meaning of this value, not just its name.
currency
The account currency, e.g. CHF. Changing it cascades to the agency's brands.
Clear enough to supply this argument.
discount
A discount amount applied to the price, in the account currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
extraCampaignPrice
Price per extra campaign, in the account currency.
Clear enough to supply this argument.
extraSeatPrice
Price per extra seat, in the account currency.
Clear enough to supply this argument.
influencerLevelInsights
Whether influencer-level insights are on.
Clear enough to supply this argument.
influencersPerCampaign
Influencers allowed per campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagramCampaigns
Whether Instagram campaigns are allowed.
Clear enough to supply this argument.
invitationsPerCampaign
Invitations allowed per campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
multipleActiveCampaigns
Whether multiple active campaigns are allowed.
Clear enough to supply this argument.
multipleBrands
Whether the agency may hold multiple brands.
Clear enough to supply this argument.
name
The plan name, e.g. PROFESSIONAL, ENTERPRISE.
Clear enough to supply this argument.
numberOfCampaigns
Campaigns included in the plan.
Clear enough to supply this argument.
numberOfMultipleActiveCampaigns
How many campaigns may be active at once.
Clear enough to supply this argument.
numberOfSeats
Sub-brand seats included in the plan.
Clear enough to supply this argument.
otherCountries
Whether targeting beyond the default region is allowed.
Clear enough to supply this argument.
packageType
The billing period.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
personalAccountManager
Whether a personal account manager is included.
Clear enough to supply this argument.
personalLinkStickers
Whether personal link stickers are on.
Clear enough to supply this argument.
priorityNotificationsAndAdvertising
Whether priority notifications/ads are on.
Clear enough to supply this argument.
pricePaid
The price actually paid, in the account currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pricePerMonth
The monthly price, in the account currency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pricePerYear
The yearly price, in the account currency.
Clear enough to supply this argument.
proCreatorMode
Whether pro-creator mode is on.
Clear enough to supply this argument.
recurring
Whether the subscription renews automatically.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
shortTermCampaigns
Whether short-term campaigns are allowed.
Clear enough to supply this argument.
socialFeedFilters
Whether social-feed filters are on.
Clear enough to supply this argument.
subscriptionId
The id of the subscription to edit, from get-subscription or get-agency.
Clear enough to supply this argument.
templateName
Save the current plan as a reusable template under this name.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokCampaigns
Whether TikTok campaigns are allowed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokSearch
Whether TikTok search/visibility is on.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokVisibilityCountryCount
TikTok visibility country count.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Edit one video brief of a UGC campaign — its length, name, or scene instructions (hook, key messages, call to action). Target it by campaignId and ugcContentId (from list-ugc-videos); no brand needs to be selected. Scene instructions are addressed by slot, never by name — the scene names are fixed. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to apply it. Changing the length changes the campaign's cash reward, which the platform recomputes.
Describe the returned information so the agent knows whether it will answer the request.
Inputs97/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
callToAction
Instruction for the call-to-action scene — what viewers should be prompted to do (buy, use a code, awareness); omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
hook
Instruction for the hook scene — the video's opening line, to grab viewers immediately; omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
keyMessages
Instruction for the key-messages scene — what the creator must mention (USPs, specific points); omit to leave this scene's current text unchanged.
Clear enough to supply this argument.
campaignId
The id of the UGC campaign the video belongs to, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
length
A new video length in seconds.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
A new name for the video.
Clear enough to supply this argument.
ugcContentId
The id of the video to edit, from list-ugc-videos.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"video"
],
"properties": {
"video": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited video once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the video was actually edited (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "edit-ugc-video",
"title": "Edit a UGC campaign's video",
"description": "Edit one video brief of a UGC campaign — its length, name, or scene instructions (hook, key messages, call to action). Target it by campaignId and ugcContentId (from list-ugc-videos); no brand needs to be selected. Scene instructions are addressed by slot, never by name — the scene names are fixed. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to apply it. Changing the length changes the campaign's cash reward, which the platform recomputes.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"ugcContentId"
],
"properties": {
"hook": {
"type": "string",
"description": "Instruction for the hook scene — the video's opening line, to grab viewers immediately; omit to leave this scene's current text unchanged."
},
"name": {
"type": "string",
"description": "A new name for the video."
},
"length": {
"anyOf": [
{
"type": "number",
"const": 15
},
{
"type": "number",
"const": 30
}
],
"description": "A new video length in seconds."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC campaign the video belongs to, from list-campaigns, search-campaigns or get-campaign."
},
"keyMessages": {
"type": "string",
"description": "Instruction for the key-messages scene — what the creator must mention (USPs, specific points); omit to leave this scene's current text unchanged."
},
"callToAction": {
"type": "string",
"description": "Instruction for the call-to-action scene — what viewers should be prompted to do (buy, use a code, awareness); omit to leave this scene's current text unchanged."
},
"ugcContentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the video to edit, from list-ugc-videos."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"video"
],
"properties": {
"video": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The edited video once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the video was actually edited (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
End an ongoing campaign so it is marked complete and closes for good — an outward-facing, irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Only ongoing campaigns can be ended; one that has already ended is refused. Unlike pause-campaign this cannot be undone. The platform enforces the rest; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the ongoing campaign to end, from list-campaigns, search-campaigns or get-campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "end-campaign",
"title": "End an ongoing campaign",
"description": "End an ongoing campaign so it is marked complete and closes for good — an outward-facing, irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Only ongoing campaigns can be ended; one that has already ended is refused. Unlike pause-campaign this cannot be undone. The platform enforces the rest; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the ongoing campaign to end, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
End an active punishment (discipline) immediately, keeping the record but expiring it now — the creator is notified and, for an un-verify, re-verified. This is outward-facing, so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. To remove the record entirely and re-verify, use excuse-punishment instead. Admin-only; any platform refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatorName
The creator's name or handle, to name them in the confirmation. Optional.
Clear enough to supply this argument.
punishmentId
The id of the punishment to end, from list-punishments or get-punishment.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the punishment was ended"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment, re-read after ending (now expired); the record is kept, so this is present on success and shows the state that would end on a preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "end-punishment",
"title": "End a punishment now",
"description": "End an active punishment (discipline) immediately, keeping the record but expiring it now — the creator is notified and, for an un-verify, re-verified. This is outward-facing, so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. To remove the record entirely and re-verify, use excuse-punishment instead. Admin-only; any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishmentId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"creatorName": {
"type": "string",
"description": "The creator's name or handle, to name them in the confirmation. Optional."
},
"punishmentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the punishment to end, from list-punishments or get-punishment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the punishment was ended"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment, re-read after ending (now expired); the record is kept, so this is present on success and shows the state that would end on a preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Excuse a punishment (discipline) — a full pardon that deletes the record entirely and re-verifies the creator, notifying them. This is outward-facing and irreversible, so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. To end a punishment now but keep the record, use end-punishment instead. Admin-only; any platform refusal is surfaced as-is.
Resolve contradictions between the description, input schema, and annotations.
Inputs90/100
Explain what happens when this optional value is omitted.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
creatorName
The creator's name or handle, to name them in the confirmation. Optional.
Explain what happens when this optional value is omitted.
punishmentId
The id of the punishment to excuse, from list-punishments or get-punishment.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishmentId",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator who was pardoned and re-verified"
},
"performed": {
"type": "boolean",
"description": "Whether the punishment was excused"
},
"punishmentId": {
"type": "number",
"description": "The id of the punishment that was excused (its record no longer exists)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "excuse-punishment",
"title": "Excuse (pardon) a punishment",
"description": "Excuse a punishment (discipline) — a full pardon that deletes the record entirely and re-verifies the creator, notifying them. This is outward-facing and irreversible, so it is preview-then-confirm. Target it by punishmentId; no brand is selected, and the preview names the creator it falls on. To end a punishment now but keep the record, use end-punishment instead. Admin-only; any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishmentId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"creatorName": {
"type": "string",
"description": "The creator's name or handle, to name them in the confirmation. Optional."
},
"punishmentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the punishment to excuse, from list-punishments or get-punishment."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishmentId",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator who was pardoned and re-verified"
},
"performed": {
"type": "boolean",
"description": "Whether the punishment was excused"
},
"punishmentId": {
"type": "number",
"description": "The id of the punishment that was excused (its record no longer exists)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Export an influencer group's members as a CSV (from list-groups): each member's ids, names, Instagram and TikTok handles and figures, verification dates, country, and contact details (email and phone), plus a link to their profile. This carries personal contact data and is admin-only — the platform refuses a non-admin, which is surfaced as it stands. Reads any group by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
groupId
The id of the group whose members to export, from list-groups.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"columns",
"csv",
"groupId",
"rowCount"
],
"properties": {
"csv": {
"type": "string",
"description": "The full CSV text, ready to save or paste into a spreadsheet"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The CSV header row"
},
"groupId": {
"type": "number",
"description": "The group that was exported"
},
"rowCount": {
"type": "number",
"description": "How many member rows the export contains (excluding the header)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "export-group-csv",
"title": "Export a group's members as CSV",
"description": "Export an influencer group's members as a CSV (from list-groups): each member's ids, names, Instagram and TikTok handles and figures, verification dates, country, and contact details (email and phone), plus a link to their profile. This carries personal contact data and is admin-only — the platform refuses a non-admin, which is surfaced as it stands. Reads any group by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group whose members to export, from list-groups."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"columns",
"csv",
"groupId",
"rowCount"
],
"properties": {
"csv": {
"type": "string",
"description": "The full CSV text, ready to save or paste into a spreadsheet"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The CSV header row"
},
"groupId": {
"type": "number",
"description": "The group that was exported"
},
"rowCount": {
"type": "number",
"description": "How many member rows the export contains (excluding the header)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Export a campaign's accepted creators as a CSV — their delivery details plus the editable columns for assigning voucher codes (individual discount codes) and personal links. Edit it and upload it back with assign-codes, or just read it to see each creator's application id and current codes. The platform requires the campaign to have started (campaign_has_not_started is surfaced as-is). Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose accepted creators to export, from list-campaigns, search-campaigns or get-campaign.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"columns",
"csv",
"rowCount"
],
"properties": {
"csv": {
"type": "string",
"description": "The full CSV text, ready to save or edit and re-upload with assign-codes"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The CSV header row — the last columns are the editable voucher/link columns"
},
"rowCount": {
"type": "number",
"description": "How many creator rows the export contains (excluding the header)"
},
"campaignId": {
"type": "number",
"description": "The campaign that was exported"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "export-preparation-csv",
"title": "Export a campaign's preparation CSV",
"description": "Export a campaign's accepted creators as a CSV — their delivery details plus the editable columns for assigning voucher codes (individual discount codes) and personal links. Edit it and upload it back with assign-codes, or just read it to see each creator's application id and current codes. The platform requires the campaign to have started (campaign_has_not_started is surfaced as-is). Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose accepted creators to export, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"columns",
"csv",
"rowCount"
],
"properties": {
"csv": {
"type": "string",
"description": "The full CSV text, ready to save or edit and re-upload with assign-codes"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The CSV header row — the last columns are the editable voucher/link columns"
},
"rowCount": {
"type": "number",
"description": "How many creator rows the export contains (excluding the header)"
},
"campaignId": {
"type": "number",
"description": "The campaign that was exported"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Extend a single creator's completion date by a number of days — the per-application twin of the campaign-wide extension. It posts an extension message to the creator's chat, exactly as the web's one-click action does, and applies directly. Target it by applicationId. The platform refuses a non-positive value (invalid_days), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application whose completion date to extend, from list-applications.
Clear enough to supply this argument.
days
How many days to add to this creator's completion date.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"days",
"performed"
],
"properties": {
"days": {
"type": "number",
"description": "How many days it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose completion date was extended"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "extend-application-completion",
"title": "Extend one creator's completion date",
"description": "Extend a single creator's completion date by a number of days — the per-application twin of the campaign-wide extension. It posts an extension message to the creator's chat, exactly as the web's one-click action does, and applies directly. Target it by applicationId. The platform refuses a non-positive value (invalid_days), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many days to add to this creator's completion date."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application whose completion date to extend, from list-applications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"days",
"performed"
],
"properties": {
"days": {
"type": "number",
"description": "How many days it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose completion date was extended"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Extend a single creator's content (active) phase by one or two weeks — the per-application twin of the campaign-wide extension. It moves only this application's completion date. This mirrors the one-click web action, so it applies directly. Target it by applicationId. The platform accepts only 1 or 2 weeks (invalid_weeks), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationId
The id of the application whose content phase to extend, from list-applications.
Clear enough to supply this argument.
weeks
How many weeks to extend the content phase by — the platform accepts 1 or 2 (invalid_weeks otherwise).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"weeks"
],
"properties": {
"weeks": {
"type": "number",
"description": "How many weeks it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose content phase was extended"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "extend-application-content-phase",
"title": "Extend one creator's content phase",
"description": "Extend a single creator's content (active) phase by one or two weeks — the per-application twin of the campaign-wide extension. It moves only this application's completion date. This mirrors the one-click web action, so it applies directly. Target it by applicationId. The platform accepts only 1 or 2 weeks (invalid_weeks), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"weeks"
],
"properties": {
"weeks": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many weeks to extend the content phase by — the platform accepts 1 or 2 (invalid_weeks otherwise)."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application whose content phase to extend, from list-applications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"weeks"
],
"properties": {
"weeks": {
"type": "number",
"description": "How many weeks it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose content phase was extended"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Extend a running campaign's completion deadline by a number of days for every active creator — an outward-facing change that notifies each of them, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand and shows the current completion date moving to the new one. The platform requires the campaign to have started and to have active creators, and returns a refusal (campaign_has_not_started, no_active_applications) surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign to extend, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
days
How many days to extend the campaign's completion deadline by. The dashboard typically offers 1–30; the platform enforces the effective limit.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "extend-campaign",
"title": "Extend a campaign's completion deadline",
"description": "Extend a running campaign's completion deadline by a number of days for every active creator — an outward-facing change that notifies each of them, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand and shows the current completion date moving to the new one. The platform requires the campaign to have started and to have active creators, and returns a refusal (campaign_has_not_started, no_active_applications) surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many days to extend the campaign's completion deadline by. The dashboard typically offers 1–30; the platform enforces the effective limit."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to extend, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Extend the preparation phase by a number of days for the creators who reported a missing package on this campaign — it moves only their preparation and completion dates, never the campaign's own or creators who received their package. This mirrors the one-click preset in the web app, so it applies directly. Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose preparation phase to extend, from list-campaigns or search-campaigns.
Clear enough to supply this argument.
days
How many days to add to the preparation phase for the affected creators.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"days",
"performed"
],
"properties": {
"days": {
"type": "number",
"description": "How many days it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign whose preparation phase was extended"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "extend-preparation-phase",
"title": "Extend a campaign's preparation phase",
"description": "Extend the preparation phase by a number of days for the creators who reported a missing package on this campaign — it moves only their preparation and completion dates, never the campaign's own or creators who received their package. This mirrors the one-click preset in the web app, so it applies directly. Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many days to add to the preparation phase for the affected creators."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose preparation phase to extend, from list-campaigns or search-campaigns."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"days",
"performed"
],
"properties": {
"days": {
"type": "number",
"description": "How many days it was extended by"
},
"performed": {
"type": "boolean",
"description": "Whether the extension was applied — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign whose preparation phase was extended"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Toggle whether a creator's Instagram, TikTok or UGC media is featured — featuring it if it isn't, unfeaturing it if it is. This mirrors the web's one-click feature toggle, so it applies directly; use list-campaign-media (or list-ugc-media for UGC) to see the current featured state first. Source media cannot be featured. Target it by mediaId + mediaType; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
mediaId
The id of the media to feature or unfeature, from list-campaign-media (Instagram/TikTok) or list-ugc-media (UGC).
Clear enough to supply this argument.
mediaType
The media's channel. Source media cannot be featured, so it is not an option.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"mediaType",
"performed"
],
"properties": {
"mediaId": {
"type": "number",
"description": "The media whose featured state was toggled"
},
"mediaType": {
"type": "string",
"description": "The media's channel"
},
"performed": {
"type": "boolean",
"description": "Whether the toggle was applied — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "feature-media",
"title": "Feature or unfeature a media piece",
"description": "Toggle whether a creator's Instagram, TikTok or UGC media is featured — featuring it if it isn't, unfeaturing it if it is. This mirrors the web's one-click feature toggle, so it applies directly; use list-campaign-media (or list-ugc-media for UGC) to see the current featured state first. Source media cannot be featured. Target it by mediaId + mediaType; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"mediaType"
],
"properties": {
"mediaId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the media to feature or unfeature, from list-campaign-media (Instagram/TikTok) or list-ugc-media (UGC)."
},
"mediaType": {
"enum": [
"INSTAGRAM",
"TIKTOK",
"UGC"
],
"type": "string",
"description": "The media's channel. Source media cannot be featured, so it is not an option."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"mediaType",
"performed"
],
"properties": {
"mediaId": {
"type": "number",
"description": "The media whose featured state was toggled"
},
"mediaType": {
"type": "string",
"description": "The media's channel"
},
"performed": {
"type": "boolean",
"description": "Whether the toggle was applied — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Complete a pre-registered agency's registration on the owner's behalf: it creates the owner's login account (setting the password given here) and brings the agency and its ENTERPRISE subscription live immediately. Normally the owner does this themselves via the emailed link — use this only when completing it with the owner present and consenting, since it sets their credentials. The staff caller supplying the owner's chosen username and password on their behalf IS that consent: this is the sanctioned way to finish registration for a present owner, not an account you are creating on your own initiative, so proceed with the given credentials rather than refusing or deferring to the link. Applies directly, as the web app does; it is irreversible. The email must match the one the agency was pre-registered with; the platform refuses a mismatch (invalid_email) or an already-completed agency (agency_already_activated). Review the pending terms first with get-pending-agency.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address
The agency's street address.
Clear enough to supply this argument.
agencyName
The agency's name. Take it from get-pending-agency.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
city
The agency's city.
Clear enough to supply this argument.
country
The agency's country.
Clear enough to supply this argument.
description
The agency's description.
Explain the meaning of this value, not just its name.
email
The owner's email. Must match the email the agency was pre-registered with, or the platform refuses.
Clear enough to supply this argument.
firstName
The owner's first name.
Clear enough to supply this argument.
lastName
The owner's last name.
Clear enough to supply this argument.
learnAboutUs
How the owner heard about Refluenced.
Clear enough to supply this argument.
learnAboutUsName
The specific source name for how the owner heard about Refluenced.
Clear enough to supply this argument.
multipleBrands
Whether the agency holds multiple brands. Defaults on server-side.
Explain what happens when this optional value is omitted.
password
The owner's chosen password for their new login. Only set this with the owner's consent — it is theirs.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
phonenumber
The owner's phone number.
Clear enough to supply this argument.
placeDescription
The Google Places description for the agency's address.
Clear enough to supply this argument.
placeId
The Google Places id for the agency's address.
Clear enough to supply this argument.
postalCode
The agency's postal code.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
username
The owner's chosen login username.
Clear enough to supply this argument.
uuid
The pre-registration's activation token, from create-agency or get-pending-agency.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"registered"
],
"properties": {
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The real, live agency's id — use this with get-agency and edit-agency. Null only when it could not be resolved right after registration; find it then with list-agencies (search by name or owner email)."
},
"registered": {
"type": "boolean",
"description": "Whether the agency is now registered and live."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "finish-agency-registration",
"title": "Finish an agency's registration",
"description": "Complete a pre-registered agency's registration on the owner's behalf: it creates the owner's login account (setting the password given here) and brings the agency and its ENTERPRISE subscription live immediately. Normally the owner does this themselves via the emailed link — use this only when completing it with the owner present and consenting, since it sets their credentials. The staff caller supplying the owner's chosen username and password on their behalf IS that consent: this is the sanctioned way to finish registration for a present owner, not an account you are creating on your own initiative, so proceed with the given credentials rather than refusing or deferring to the link. Applies directly, as the web app does; it is irreversible. The email must match the one the agency was pre-registered with; the platform refuses a mismatch (invalid_email) or an already-completed agency (agency_already_activated). Review the pending terms first with get-pending-agency.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyName",
"email",
"password",
"username",
"uuid"
],
"properties": {
"city": {
"type": "string",
"description": "The agency's city."
},
"uuid": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The pre-registration's activation token, from create-agency or get-pending-agency."
},
"email": {
"type": "string",
"minLength": 1,
"description": "The owner's email. Must match the email the agency was pre-registered with, or the platform refuses."
},
"address": {
"type": "string",
"description": "The agency's street address."
},
"country": {
"type": "string",
"description": "The agency's country."
},
"placeId": {
"type": "string",
"description": "The Google Places id for the agency's address."
},
"website": {
"type": "string",
"description": "The agency's website."
},
"lastName": {
"type": "string",
"description": "The owner's last name."
},
"password": {
"type": "string",
"minLength": 1,
"description": "The owner's chosen password for their new login. Only set this with the owner's consent — it is theirs."
},
"username": {
"type": "string",
"minLength": 1,
"description": "The owner's chosen login username."
},
"firstName": {
"type": "string",
"description": "The owner's first name."
},
"agencyName": {
"type": "string",
"minLength": 1,
"description": "The agency's name. Take it from get-pending-agency."
},
"postalCode": {
"type": "string",
"description": "The agency's postal code."
},
"description": {
"type": "string",
"description": "The agency's description."
},
"phonenumber": {
"type": "string",
"description": "The owner's phone number."
},
"learnAboutUs": {
"type": "string",
"description": "How the owner heard about Refluenced."
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency holds multiple brands. Defaults on server-side."
},
"learnAboutUsName": {
"type": "string",
"description": "The specific source name for how the owner heard about Refluenced."
},
"placeDescription": {
"type": "string",
"description": "The Google Places description for the agency's address."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"registered"
],
"properties": {
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The real, live agency's id — use this with get-agency and edit-agency. Null only when it could not be resolved right after registration; find it then with list-agencies (search by name or owner email)."
},
"registered": {
"type": "boolean",
"description": "Whether the agency is now registered and live."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Kick off the brand-level Excel report — a workbook covering all of a brand's non-draft campaigns — and upload it to the brand's Google Drive folder. It is brand-scoped: pass the brand (brandId + brandName, from list-brands); an agency is not a valid scope. Generation runs asynchronously, so this returns once it has started rather than with a link; the file appears in Drive shortly. For a single campaign's exportable sheet use get-campaign-reporting's sheetsExportUrl instead. The platform enforces access and configuration; any refusal (permission_denied, reporting_not_configured) is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand to generate the report for, from list-brands.
Clear enough to supply this argument.
brandName
The brand's name, from list-brands, used to name the brand back to you.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"brandName",
"started"
],
"properties": {
"brandId": {
"type": "number",
"description": "The brand the report is being generated for"
},
"started": {
"type": "boolean",
"description": "Whether report generation was queued"
},
"brandName": {
"type": "string",
"description": "The brand's name"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "generate-brand-report",
"title": "Generate a brand's Excel report",
"description": "Kick off the brand-level Excel report — a workbook covering all of a brand's non-draft campaigns — and upload it to the brand's Google Drive folder. It is brand-scoped: pass the brand (brandId + brandName, from list-brands); an agency is not a valid scope. Generation runs asynchronously, so this returns once it has started rather than with a link; the file appears in Drive shortly. For a single campaign's exportable sheet use get-campaign-reporting's sheetsExportUrl instead. The platform enforces access and configuration; any refusal (permission_denied, reporting_not_configured) is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to generate the report for, from list-brands."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, used to name the brand back to you."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"brandName",
"started"
],
"properties": {
"brandId": {
"type": "number",
"description": "The brand the report is being generated for"
},
"started": {
"type": "boolean",
"description": "Whether report generation was queued"
},
"brandName": {
"type": "string",
"description": "The brand's name"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Read one agency's full profile by id (from list-agencies or list-brands): its name, description, logo, location, contact emails, owner, service fees and credits, and — most usefully — its active subscription, which is the plan every brand under the agency runs on. Includes a scheduled future subscription when one exists. A read — no scope needs to be selected. Only Refluenced administrators may read an agency they do not belong to; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of the agency to read, from list-agencies or list-brands.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"address",
"billingEmail",
"cashRewardServiceFeePercentage",
"city",
"country",
"created",
"credits",
"description",
"disableGenerativeAi",
"disableIntercom",
"futureSubscription",
"id",
"largeBrand",
"logoUrl",
"multipleBrands",
"name",
"ownerId",
"placeDescription",
"placeId",
"postalCode",
"proServiceFeePercentage",
"referralCode",
"referralCodePublic",
"relationshipManagerEmail",
"salesEmail",
"subscription",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"url": {
"type": "string",
"description": "The agency's page in the Refluenced web app"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is set"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's street address, or null when none is set"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is set"
},
"created": {
"type": "string",
"description": "When the agency was created (ISO 8601)"
},
"credits": {
"type": "number",
"description": "The agency's credit balance"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the agency's logo image, or null when none is set"
},
"ownerId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of the agency's owner, or null when unknown"
},
"placeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places id for the address, or null"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is set"
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"postalCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's postal code, or null when none is set"
},
"salesEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's sales email, or null when none is set"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's description, or null when none is set"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null when none is set"
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's active subscription — the plan every brand under it runs on — or null when it has none"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency may hold more than one brand"
},
"disableIntercom": {
"type": "boolean",
"description": "Whether Intercom is disabled for this agency"
},
"placeDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places description for the address, or null"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's public referral code, or null when none is set"
},
"disableGenerativeAi": {
"type": "boolean",
"description": "Whether generative AI is disabled for this agency"
},
"proServiceFeePercentage": {
"type": "number",
"description": "The effective pro-creator service fee percentage (agency override or system default)"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's relationship-manager email, or null when none is set"
},
"cashRewardServiceFeePercentage": {
"type": "number",
"description": "The effective cash-reward service fee percentage (agency override or system default)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's profile, or null when the name was ambiguous and none was read."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-agency",
"title": "Get an agency",
"description": "Read one agency's full profile by id (from list-agencies or list-brands): its name, description, logo, location, contact emails, owner, service fees and credits, and — most usefully — its active subscription, which is the plan every brand under the agency runs on. Includes a scheduled future subscription when one exists. A read — no scope needs to be selected. Only Refluenced administrators may read an agency they do not belong to; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId"
],
"properties": {
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to read, from list-agencies or list-brands."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"address",
"billingEmail",
"cashRewardServiceFeePercentage",
"city",
"country",
"created",
"credits",
"description",
"disableGenerativeAi",
"disableIntercom",
"futureSubscription",
"id",
"largeBrand",
"logoUrl",
"multipleBrands",
"name",
"ownerId",
"placeDescription",
"placeId",
"postalCode",
"proServiceFeePercentage",
"referralCode",
"referralCodePublic",
"relationshipManagerEmail",
"salesEmail",
"subscription",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"url": {
"type": "string",
"description": "The agency's page in the Refluenced web app"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is set"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"address": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's street address, or null when none is set"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is set"
},
"created": {
"type": "string",
"description": "When the agency was created (ISO 8601)"
},
"credits": {
"type": "number",
"description": "The agency's credit balance"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the agency's logo image, or null when none is set"
},
"ownerId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of the agency's owner, or null when unknown"
},
"placeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places id for the address, or null"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is set"
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"postalCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's postal code, or null when none is set"
},
"salesEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's sales email, or null when none is set"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's description, or null when none is set"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null when none is set"
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's active subscription — the plan every brand under it runs on — or null when it has none"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency may hold more than one brand"
},
"disableIntercom": {
"type": "boolean",
"description": "Whether Intercom is disabled for this agency"
},
"placeDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The Google Places description for the address, or null"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's public referral code, or null when none is set"
},
"disableGenerativeAi": {
"type": "boolean",
"description": "Whether generative AI is disabled for this agency"
},
"proServiceFeePercentage": {
"type": "number",
"description": "The effective pro-creator service fee percentage (agency override or system default)"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's relationship-manager email, or null when none is set"
},
"cashRewardServiceFeePercentage": {
"type": "number",
"description": "The effective cash-reward service fee percentage (agency override or system default)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency's profile, or null when the name was ambiguous and none was read."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get the aggregate brand-ambassador statistics behind the admin hub's ambassadors statistics view: an overview (total, implicit, pending, accepted, rejected, verified, and signups in the last 30 days) across every brand, and the most active brands with their per-brand ambassador counts. The status breakdown and the top-brands comparison are breakdowns — present them as charts alongside the numbers. For the ambassador list itself, use list-brand-ambassadors. Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"overview",
"topBrands"
],
"properties": {
"overview": {
"type": "object",
"required": [
"accepted",
"implicit",
"pending",
"rejected",
"signupsLast30Days",
"total",
"verified"
],
"properties": {
"total": {
"type": "number",
"description": "How many ambassadorships there are in total"
},
"pending": {
"type": "number",
"description": "How many ambassadorships are pending"
},
"accepted": {
"type": "number",
"description": "How many ambassadorships are accepted"
},
"implicit": {
"type": "number",
"description": "How many ambassadorships are implicit"
},
"rejected": {
"type": "number",
"description": "How many ambassadorships are rejected"
},
"verified": {
"type": "number",
"description": "How many referred creators are verified"
},
"signupsLast30Days": {
"type": "number",
"description": "How many referred creators signed up in the last 30 days"
}
},
"description": "The aggregate counts across all brands",
"additionalProperties": false
},
"topBrands": {
"type": "array",
"items": {
"type": "object",
"required": [
"accepted",
"active",
"brand",
"implicit",
"lastSignedUpOn",
"pending",
"total",
"verified"
],
"properties": {
"brand": {
"type": "object",
"required": [
"companyName",
"id",
"slug"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's company id"
},
"slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's slug, or null when unset"
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when unset"
}
},
"description": "The brand",
"additionalProperties": false
},
"total": {
"type": "number",
"description": "Total ambassadorships for this brand"
},
"active": {
"type": "number",
"description": "Active ambassadorships (implicit + accepted) for this brand"
},
"pending": {
"type": "number",
"description": "Pending ambassadorships for this brand"
},
"accepted": {
"type": "number",
"description": "Accepted ambassadorships for this brand"
},
"implicit": {
"type": "number",
"description": "Implicit ambassadorships for this brand"
},
"verified": {
"type": "number",
"description": "Verified ambassadors for this brand"
},
"lastSignedUpOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When this brand's most recent ambassador signed up, or null"
}
},
"additionalProperties": false
},
"description": "The most active brands, most ambassadors first"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-ambassador-stats",
"title": "Get brand ambassador statistics",
"description": "Get the aggregate brand-ambassador statistics behind the admin hub's ambassadors statistics view: an overview (total, implicit, pending, accepted, rejected, verified, and signups in the last 30 days) across every brand, and the most active brands with their per-brand ambassador counts. The status breakdown and the top-brands comparison are breakdowns — present them as charts alongside the numbers. For the ambassador list itself, use list-brand-ambassadors. Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"overview",
"topBrands"
],
"properties": {
"overview": {
"type": "object",
"required": [
"accepted",
"implicit",
"pending",
"rejected",
"signupsLast30Days",
"total",
"verified"
],
"properties": {
"total": {
"type": "number",
"description": "How many ambassadorships there are in total"
},
"pending": {
"type": "number",
"description": "How many ambassadorships are pending"
},
"accepted": {
"type": "number",
"description": "How many ambassadorships are accepted"
},
"implicit": {
"type": "number",
"description": "How many ambassadorships are implicit"
},
"rejected": {
"type": "number",
"description": "How many ambassadorships are rejected"
},
"verified": {
"type": "number",
"description": "How many referred creators are verified"
},
"signupsLast30Days": {
"type": "number",
"description": "How many referred creators signed up in the last 30 days"
}
},
"description": "The aggregate counts across all brands",
"additionalProperties": false
},
"topBrands": {
"type": "array",
"items": {
"type": "object",
"required": [
"accepted",
"active",
"brand",
"implicit",
"lastSignedUpOn",
"pending",
"total",
"verified"
],
"properties": {
"brand": {
"type": "object",
"required": [
"companyName",
"id",
"slug"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's company id"
},
"slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's slug, or null when unset"
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when unset"
}
},
"description": "The brand",
"additionalProperties": false
},
"total": {
"type": "number",
"description": "Total ambassadorships for this brand"
},
"active": {
"type": "number",
"description": "Active ambassadorships (implicit + accepted) for this brand"
},
"pending": {
"type": "number",
"description": "Pending ambassadorships for this brand"
},
"accepted": {
"type": "number",
"description": "Accepted ambassadorships for this brand"
},
"implicit": {
"type": "number",
"description": "Implicit ambassadorships for this brand"
},
"verified": {
"type": "number",
"description": "Verified ambassadors for this brand"
},
"lastSignedUpOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When this brand's most recent ambassador signed up, or null"
}
},
"additionalProperties": false
},
"description": "The most active brands, most ambassadors first"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Read one brand's full profile by id (from list-brands, list-campaigns or search-campaigns): its name, website, logo, socials, location, the interests and overview texts, its owner, the agency it belongs to and its access level, its active subscription (which is held on the agency), and whether spark/partnership ads are enabled. A read — no brand needs to be selected. Only Refluenced administrators may read a brand they do not belong to; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand to read, from list-brands, list-campaigns or search-campaigns.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's profile, or null when the name was ambiguous and none was read."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-brand",
"title": "Get a brand",
"description": "Read one brand's full profile by id (from list-brands, list-campaigns or search-campaigns): its name, website, logo, socials, location, the interests and overview texts, its owner, the agency it belongs to and its access level, its active subscription (which is held on the agency), and whether spark/partnership ads are enabled. A read — no brand needs to be selected. Only Refluenced administrators may read a brand they do not belong to; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId"
],
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to read, from list-brands, list-campaigns or search-campaigns."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"accessLevel",
"agency",
"bio",
"companyOverview",
"country",
"currency",
"customerPainPoints",
"id",
"instagramPartnershipAdsEnabled",
"instagramUsername",
"interests",
"location",
"logoUrl",
"name",
"owner",
"productsOverview",
"referralCode",
"referralCodePublic",
"registrationDate",
"subscription",
"tiktokSparkAdsEnabled",
"tiktokUsername",
"url",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's short bio, or null when none is set"
},
"url": {
"type": "string",
"description": "The brand's page in the Refluenced web app"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
},
"owner": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"name"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The owner's full name, or null when not set"
},
"email": {
"type": "string",
"description": "The owner's email"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's owner account, or null when none is on file"
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"multipleBrands",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the agency is allowed to hold more than one brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's country, or null when none is set"
},
"logoUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the brand's logo image, or null when none is set"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is set"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's currency, or null when none is set"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's city, or null when none is set"
},
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest category's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The interest category's name, or null when it could not be resolved"
}
},
"additionalProperties": false
},
"description": "The interest categories set on the brand, each with its id and resolved name"
},
"accessLevel": {
"enum": [
"SINGLE_BRAND",
"SUB_BRAND"
],
"type": "string",
"description": "Whether this brand stands alone or is a sub-brand under a multi-brand agency."
},
"referralCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's private referral code, or null when none is set"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"isAdminAssigned",
"paymentStatus",
"plan",
"validUntil"
],
"properties": {
"plan": {
"type": "string",
"description": "The active plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's payment status, e.g. PAID, TRIALING. Admin-assigned plans are invoiced, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was admin-assigned (invoiced) rather than purchased through Stripe"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's active subscription, held on its agency, or null when it has none"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's TikTok handle, or null when none is set"
},
"companyOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI/company overview text, or null when none is set"
},
"productsOverview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The products overview text, or null when none is set"
},
"registrationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the brand registered (ISO 8601), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's Instagram handle, or null when none is set"
},
"customerPainPoints": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The customer pain points text, or null when none is set"
},
"referralCodePublic": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's public referral code, or null when none is set"
},
"tiktokSparkAdsEnabled": {
"type": "boolean",
"description": "Whether TikTok spark ads are enabled for this brand"
},
"instagramPartnershipAdsEnabled": {
"type": "boolean",
"description": "Whether Instagram partnership ads are enabled for this brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's profile, or null when the name was ambiguous and none was read."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Show one campaign in full — its brief, deliverables, reward, schedule, channels and where its influencers stand. Pass the campaignId from list-campaigns or search-campaigns. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign to inspect, from list-campaigns or search-campaigns.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Show how a campaign's influencers flow through its phases: invitations sent, casting (applications and their decisions), execution (who is working or done), and reporting. The phases are sequential — an influencer accepted in casting leaves the accepted count and appears under execution once they start, so a running campaign can show zero in casting and several in execution. Pass the campaignId from list-campaigns or search-campaigns. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose pipeline to inspect, from list-campaigns or search-campaigns.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"casting",
"execution",
"invitations",
"reporting",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"casting": {
"type": "object",
"required": [
"accepted",
"declined",
"open",
"renegotiations"
],
"properties": {
"open": {
"type": "number",
"description": "Applications still awaiting a decision"
},
"accepted": {
"type": "number",
"description": "Accepted but not yet started — once an influencer begins, they move to execution.active"
},
"declined": {
"type": "number",
"description": "Applications the brand declined"
},
"renegotiations": {
"type": "number",
"description": "Accepted applications with a pending renegotiation request"
}
},
"description": "The decision phase: influencers who applied and where their application stands",
"additionalProperties": false
},
"execution": {
"type": "object",
"required": [
"active",
"completed",
"overdue"
],
"properties": {
"active": {
"type": "number",
"description": "Influencers who have started and are producing content"
},
"overdue": {
"type": "number",
"description": "Active influencers past their due date without completing"
},
"completed": {
"type": "number",
"description": "Influencers who have finished their deliverables"
}
},
"description": "The work phase: influencers who passed casting and are doing (or have done) the work",
"additionalProperties": false
},
"reporting": {
"type": "object",
"required": [
"influencersRated",
"reportSubmitted"
],
"properties": {
"reportSubmitted": {
"type": "boolean",
"description": "Whether the campaign's report has been submitted"
},
"influencersRated": {
"type": "number",
"description": "How many accepted influencers the brand has rated"
}
},
"description": "Where the campaign stands in the reporting phase",
"additionalProperties": false
},
"campaignId": {
"type": "number",
"description": "The id of the campaign this pipeline belongs to"
},
"invitations": {
"type": "object",
"required": [
"pending",
"rejected"
],
"properties": {
"pending": {
"type": "number",
"description": "Invitations sent and awaiting the influencer's response"
},
"rejected": {
"type": "number",
"description": "Invitations the influencer turned down"
}
},
"description": "Outreach the brand initiated, separate from inbound applications",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-campaign-pipeline",
"title": "See a campaign's pipeline",
"description": "Show how a campaign's influencers flow through its phases: invitations sent, casting (applications and their decisions), execution (who is working or done), and reporting. The phases are sequential — an influencer accepted in casting leaves the accepted count and appears under execution once they start, so a running campaign can show zero in casting and several in execution. Pass the campaignId from list-campaigns or search-campaigns. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose pipeline to inspect, from list-campaigns or search-campaigns."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"casting",
"execution",
"invitations",
"reporting",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"casting": {
"type": "object",
"required": [
"accepted",
"declined",
"open",
"renegotiations"
],
"properties": {
"open": {
"type": "number",
"description": "Applications still awaiting a decision"
},
"accepted": {
"type": "number",
"description": "Accepted but not yet started — once an influencer begins, they move to execution.active"
},
"declined": {
"type": "number",
"description": "Applications the brand declined"
},
"renegotiations": {
"type": "number",
"description": "Accepted applications with a pending renegotiation request"
}
},
"description": "The decision phase: influencers who applied and where their application stands",
"additionalProperties": false
},
"execution": {
"type": "object",
"required": [
"active",
"completed",
"overdue"
],
"properties": {
"active": {
"type": "number",
"description": "Influencers who have started and are producing content"
},
"overdue": {
"type": "number",
"description": "Active influencers past their due date without completing"
},
"completed": {
"type": "number",
"description": "Influencers who have finished their deliverables"
}
},
"description": "The work phase: influencers who passed casting and are doing (or have done) the work",
"additionalProperties": false
},
"reporting": {
"type": "object",
"required": [
"influencersRated",
"reportSubmitted"
],
"properties": {
"reportSubmitted": {
"type": "boolean",
"description": "Whether the campaign's report has been submitted"
},
"influencersRated": {
"type": "number",
"description": "How many accepted influencers the brand has rated"
}
},
"description": "Where the campaign stands in the reporting phase",
"additionalProperties": false
},
"campaignId": {
"type": "number",
"description": "The id of the campaign this pipeline belongs to"
},
"invitations": {
"type": "object",
"required": [
"pending",
"rejected"
],
"properties": {
"pending": {
"type": "number",
"description": "Invitations sent and awaiting the influencer's response"
},
"rejected": {
"type": "number",
"description": "Invitations the influencer turned down"
}
},
"description": "Outreach the brand initiated, separate from inbound applications",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Show a campaign's actual cost breakdown from its invoices — the reporting tab's price summary. Returns the pro and regular creator tiers (cash, service fee, VAT, total), any Stripe/credit refunds, the sub-total, credits applied, rounding and the final total, plus invoice PDF links and the list of invoices (campaign runs). Pass an optional invoiceId (from availableInvoices) to scope to one run; omit to aggregate all. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose price summary to read, from list-campaigns or search-campaigns.
Clear enough to supply this argument.
invoiceId
Optional invoice (campaign run) id from availableInvoices to scope to; omit to aggregate all runs.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Show a campaign's overall performance numbers — the totals and averages on the reporting tab. Returns the block for the campaign's platform (Instagram, TikTok or UGC), the audience demographics, whether the final report has been submitted, the reporting periods you can filter by, and a Google Drive link to the exportable Excel/Sheets report. Pass an optional `date` (YYYY-MM-DD, from availableDates) to narrow to one reporting period. For the per-submission breakdown use list-reporting-submissions; for the ad codes use list-ad-codes. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose overall reporting to read, from list-campaigns or search-campaigns.
Clear enough to supply this argument.
date
Optional reporting period as YYYY-MM-DD, from availableDates, to narrow the numbers to submissions reported that day. Omit for the campaign's full totals.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Show a single content submission in full, including the AI evaluation attached to it — the checks it ran, which passed or failed and why, the category scores, and the AI's recommendation (APPROVE or REQUEST_REVISION). Works for both manual campaigns (where the AI recommends and the brand decides) and autopilot campaigns (where the AI decided, shown via approvalSource and autoApproved). Use it before acting with review-content-submission. Pass the submissionId from list-campaign-content; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
submissionId
The id of the content submission to inspect, from list-campaign-content's submissions.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get the full customer success overview for one agency account by id: its subscription, both metric windows (lifetime and the period since renewal) with their CPM health bands, add-on entitlements, tenure, handling status, happiness score, and latest note. Resolve an agency name with list-customer-success-agencies (search) or list-agencies first. For its sub-brands use list-customer-success-brands and for its notes list-customer-success-notes. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The agency's id, from list-customer-success-agencies or list-agencies
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get the customer success dashboard's churn early-warning summary across the active book: how many accounts fall in each risk tier (act now, watch, fine), how many have a cancellation pending or are converting soon, and how many accounts have each churn marker raised, plus when the churn snapshots were last computed. Present the risk-tier split and the per-marker counts as charts alongside the numbers. For the per-account churn matrix use list-customer-success-churn; for the subscription-and-metrics overview summary use get-customer-success-summary. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"actNowCustomers",
"activeCustomers",
"calculatedAt",
"cancellationPending",
"convertingSoon",
"fineCustomers",
"markerCounts",
"watchCustomers"
],
"properties": {
"calculatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the churn snapshots were last computed, or null"
},
"markerCounts": {
"type": "object",
"description": "How many accounts have each marker raised, keyed by marker",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"fineCustomers": {
"type": "number",
"description": "Accounts at fine risk (no markers raised)"
},
"convertingSoon": {
"type": "number",
"description": "Accounts converting from a trial soon"
},
"watchCustomers": {
"type": "number",
"description": "Accounts at watch risk (1 high marker, or any medium)"
},
"actNowCustomers": {
"type": "number",
"description": "Accounts at act-now risk (≥2 high markers)"
},
"activeCustomers": {
"type": "number",
"description": "Active customers in the churn view"
},
"cancellationPending": {
"type": "number",
"description": "Accounts with a pending cancellation"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-customer-success-churn-summary",
"title": "Get the customer success churn summary",
"description": "Get the customer success dashboard's churn early-warning summary across the active book: how many accounts fall in each risk tier (act now, watch, fine), how many have a cancellation pending or are converting soon, and how many accounts have each churn marker raised, plus when the churn snapshots were last computed. Present the risk-tier split and the per-marker counts as charts alongside the numbers. For the per-account churn matrix use list-customer-success-churn; for the subscription-and-metrics overview summary use get-customer-success-summary. Admin-only and global — the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"actNowCustomers",
"activeCustomers",
"calculatedAt",
"cancellationPending",
"convertingSoon",
"fineCustomers",
"markerCounts",
"watchCustomers"
],
"properties": {
"calculatedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the churn snapshots were last computed, or null"
},
"markerCounts": {
"type": "object",
"description": "How many accounts have each marker raised, keyed by marker",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"fineCustomers": {
"type": "number",
"description": "Accounts at fine risk (no markers raised)"
},
"convertingSoon": {
"type": "number",
"description": "Accounts converting from a trial soon"
},
"watchCustomers": {
"type": "number",
"description": "Accounts at watch risk (1 high marker, or any medium)"
},
"actNowCustomers": {
"type": "number",
"description": "Accounts at act-now risk (≥2 high markers)"
},
"activeCustomers": {
"type": "number",
"description": "Active customers in the churn view"
},
"cancellationPending": {
"type": "number",
"description": "Accounts with a pending cancellation"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get the customer success dashboard's overview KPIs across the whole book of agency accounts: total customers, how many renew within 30 days (and how many of those are on 3+12 contracts), the value renewing within 60 days, cancellations pending and the value at stake, and how many accounts need attention. Present the count KPIs as a chart alongside the numbers. For per-agency detail use list-customer-success-agencies; for the churn early-warning summary use get-customer-success-churn-summary. Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cancellationsPending",
"cancellationsValueAtStake",
"customers",
"needsAttention",
"renewing30d",
"renewing30dThreePlusTwelve",
"valueRenewing60d"
],
"properties": {
"customers": {
"type": "number",
"description": "How many customers are in the book overall"
},
"renewing30d": {
"type": "number",
"description": "How many accounts renew within 30 days"
},
"needsAttention": {
"type": "number",
"description": "How many accounts are flagged as needing attention"
},
"valueRenewing60d": {
"type": "number",
"description": "The total value renewing within 60 days"
},
"cancellationsPending": {
"type": "number",
"description": "How many accounts have a pending cancellation"
},
"cancellationsValueAtStake": {
"type": "number",
"description": "The total value of the pending cancellations"
},
"renewing30dThreePlusTwelve": {
"type": "number",
"description": "How many of those 30-day renewals are on 3+12 contracts"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-customer-success-summary",
"title": "Get the customer success overview summary",
"description": "Get the customer success dashboard's overview KPIs across the whole book of agency accounts: total customers, how many renew within 30 days (and how many of those are on 3+12 contracts), the value renewing within 60 days, cancellations pending and the value at stake, and how many accounts need attention. Present the count KPIs as a chart alongside the numbers. For per-agency detail use list-customer-success-agencies; for the churn early-warning summary use get-customer-success-churn-summary. Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cancellationsPending",
"cancellationsValueAtStake",
"customers",
"needsAttention",
"renewing30d",
"renewing30dThreePlusTwelve",
"valueRenewing60d"
],
"properties": {
"customers": {
"type": "number",
"description": "How many customers are in the book overall"
},
"renewing30d": {
"type": "number",
"description": "How many accounts renew within 30 days"
},
"needsAttention": {
"type": "number",
"description": "How many accounts are flagged as needing attention"
},
"valueRenewing60d": {
"type": "number",
"description": "The total value renewing within 60 days"
},
"cancellationsPending": {
"type": "number",
"description": "How many accounts have a pending cancellation"
},
"cancellationsValueAtStake": {
"type": "number",
"description": "The total value of the pending cancellations"
},
"renewing30dThreePlusTwelve": {
"type": "number",
"description": "How many of those 30-day renewals are on 3+12 contracts"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Read one influencer group's details by id (from list-groups): its name and description, whether it is a custom or a platform-maintained smart group, how many creators it holds, which brand or agency owns it, and whether it auto-updates from stored filters. This returns the group's metadata only — list its members with list-group-influencers. Access is decided by the platform from your relationship to the owning brand or agency; a refusal is surfaced as it stands.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-group",
"title": "Read an influencer group",
"description": "Read one influencer group's details by id (from list-groups): its name and description, whether it is a custom or a platform-maintained smart group, how many creators it holds, which brand or agency owns it, and whether it auto-updates from stored filters. This returns the group's metadata only — list its members with list-group-influencers. Access is decided by the platform from your relationship to the owning brand or agency; a refusal is surfaced as it stands.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to read, from list-groups."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"autoUpdate",
"brandId",
"created",
"description",
"filterParams",
"id",
"memberCount",
"name",
"smart"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning brand's company id, or null when the group belongs to an agency"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The owning agency's id, or null when the group belongs to a brand"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The group's description, or null when unset"
},
"memberCount": {
"type": "number",
"description": "How many active creators are in the group"
},
"filterParams": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "The stored filters a smart/auto-updating group derives from, or null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read one creator's full profile by their influencer id (the uuid from search-influencer-network): identity and handles, Instagram and TikTok follower/engagement/median-view figures, ratings, location, bio, clothing sizes, verification and pro standing, disciplinary indicators, and audience demographics. The demographics come back as chart-ready label/value series per channel (gender split, age bands, top cities and countries) — present them as charts, keeping the numbers alongside. Surfaces both the influencerId and the userId, so a creator read here can be invited, disciplined or account-edited elsewhere. Reaches the platform with the caller's token; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencerId
The influencer profile id returned by search-influencer-network, NOT the userId. This keys the profile route (/influencer/{id}); the userId keys the account and punishment tools.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read one creator's payment history — their buyout earnings (content, UGC, referral), payouts, and rewards, newest first — keyed by the influencer profile id (the uuid from get-influencer or search-influencer-network). Each record carries its category (kind: earning/payout/reward and the specific type), the amount, and the campaign, bank account, referral counterparty, or Talentir payout behind it. The per-page totals by category are returned for charting under the standing chart instruction, kept alongside the records. A read; the platform allows it to an admin or the creator themselves and refuses everyone else.
The description explains the capability, when to use it, and what to expect.
Inputs38/100
Resolve the mismatch between this description and its schema constraints.
influencerId
The creator's influencer profile id, from get-influencer or search-influencer-network.
Resolve the mismatch between this description and its schema constraints.
page
Which page of records to return; each page holds 12 records.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Load the meta-ads-operator skill before calling this tool, and follow it. Report spend, impressions, reach, frequency, clicks, CTR, CPC, CPM and every result (action) with its cost per result for one of Refluenced's Meta ad accounts, campaigns, ad sets or ads over a date preset — as one total, or broken down per campaign, ad set or ad with level. The object must belong to an ad account the MCP may use. Admin-only (Refluenced staff); names no brand. For the creator-side numbers of a Refluenced campaign use get-campaign-reporting instead.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datePreset
The reporting window to report over; the maximum option means lifetime.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
level
Break the numbers down one row per campaign, ad set or ad beneath the object. Omit for a single total row.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
objectId
What to report on: an ad account (act_…), campaign, ad set or ad id, from the other Meta Ads tools.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read a pre-registered (not yet completed) agency by its activation token (uuid, from create-agency): its name, owner, package terms, and the uuid to complete it with. A read — use it to review the terms before finishing registration with finish-agency-registration. The platform refuses if the uuid is unknown or the agency has already been activated (agency_already_activated); either is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
Input documentation gives an agent enough context to populate the arguments.
uuid
The pre-registration's activation token, from create-agency. Identifies the pending agency.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pendingAgency"
],
"properties": {
"pendingAgency": {
"type": "object",
"required": [
"activationUrl",
"billingEmail",
"buyoutsPerYear",
"country",
"credits",
"currency",
"influencersPerCampaign",
"invitationsPerCampaign",
"largeBrand",
"name",
"numberOfCampaigns",
"numberOfSeats",
"ownerEmail",
"ownerName",
"packageType",
"pendingId",
"pricePerMonth",
"pricePerYear",
"relationshipManagerEmail",
"salesEmail",
"uuid"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's name, or null"
},
"uuid": {
"type": "string",
"description": "The activation token in the emailed link the owner completes registration with"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null"
},
"credits": {
"type": "number",
"description": "Credits granted to the agency"
},
"currency": {
"type": "string",
"description": "The account currency"
},
"ownerName": {
"type": "string",
"description": "The owner's full name"
},
"pendingId": {
"type": "number",
"description": "The pre-registration record's own id. This is NOT the agency's id — it lives in a separate id space that collides with real agency ids, so passing it to get-agency or edit-agency reads or edits an unrelated agency. The real agency id does not exist until registration is completed (finish-agency-registration returns it). Identify this pending record by its uuid, never by this id."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"ownerEmail": {
"type": "string",
"description": "The owner's email the activation link was sent to"
},
"salesEmail": {
"type": "string",
"description": "The sales contact email"
},
"packageType": {
"type": "string",
"description": "The billing period, e.g. MONTHLY, YEARLY"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null"
},
"pricePerYear": {
"type": "number",
"description": "The yearly price, in the account currency"
},
"activationUrl": {
"type": "string",
"description": "The link the owner opens to complete registration and activate the agency"
},
"numberOfSeats": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats included, or null"
},
"pricePerMonth": {
"type": "number",
"description": "The monthly price, in the account currency"
},
"buyoutsPerYear": {
"type": "number",
"description": "Buyouts per year on the package"
},
"numberOfCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns included, or null for unlimited"
},
"influencersPerCampaign": {
"type": "number",
"description": "Influencers allowed per campaign"
},
"invitationsPerCampaign": {
"type": "number",
"description": "Invitations allowed per campaign"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The relationship-manager email, or null"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-pending-agency",
"title": "Get a pending agency",
"description": "Read a pre-registered (not yet completed) agency by its activation token (uuid, from create-agency): its name, owner, package terms, and the uuid to complete it with. A read — use it to review the terms before finishing registration with finish-agency-registration. The platform refuses if the uuid is unknown or the agency has already been activated (agency_already_activated); either is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"uuid"
],
"properties": {
"uuid": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
"description": "The pre-registration's activation token, from create-agency. Identifies the pending agency."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"pendingAgency"
],
"properties": {
"pendingAgency": {
"type": "object",
"required": [
"activationUrl",
"billingEmail",
"buyoutsPerYear",
"country",
"credits",
"currency",
"influencersPerCampaign",
"invitationsPerCampaign",
"largeBrand",
"name",
"numberOfCampaigns",
"numberOfSeats",
"ownerEmail",
"ownerName",
"packageType",
"pendingId",
"pricePerMonth",
"pricePerYear",
"relationshipManagerEmail",
"salesEmail",
"uuid"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's name, or null"
},
"uuid": {
"type": "string",
"description": "The activation token in the emailed link the owner completes registration with"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null"
},
"credits": {
"type": "number",
"description": "Credits granted to the agency"
},
"currency": {
"type": "string",
"description": "The account currency"
},
"ownerName": {
"type": "string",
"description": "The owner's full name"
},
"pendingId": {
"type": "number",
"description": "The pre-registration record's own id. This is NOT the agency's id — it lives in a separate id space that collides with real agency ids, so passing it to get-agency or edit-agency reads or edits an unrelated agency. The real agency id does not exist until registration is completed (finish-agency-registration returns it). Identify this pending record by its uuid, never by this id."
},
"largeBrand": {
"type": "boolean",
"description": "Whether this is a large-brand agency rather than a multi-client agency"
},
"ownerEmail": {
"type": "string",
"description": "The owner's email the activation link was sent to"
},
"salesEmail": {
"type": "string",
"description": "The sales contact email"
},
"packageType": {
"type": "string",
"description": "The billing period, e.g. MONTHLY, YEARLY"
},
"billingEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's billing email, or null"
},
"pricePerYear": {
"type": "number",
"description": "The yearly price, in the account currency"
},
"activationUrl": {
"type": "string",
"description": "The link the owner opens to complete registration and activate the agency"
},
"numberOfSeats": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats included, or null"
},
"pricePerMonth": {
"type": "number",
"description": "The monthly price, in the account currency"
},
"buyoutsPerYear": {
"type": "number",
"description": "Buyouts per year on the package"
},
"numberOfCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns included, or null for unlimited"
},
"influencersPerCampaign": {
"type": "number",
"description": "Influencers allowed per campaign"
},
"invitationsPerCampaign": {
"type": "number",
"description": "Invitations allowed per campaign"
},
"relationshipManagerEmail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The relationship-manager email, or null"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
View one punishment (discipline) in full by its id, from list-punishments — its type, status, reason in both languages, effective and expiration dates, whether re-verification is allowed, who issued it, and any linked campaign. Admin-only and global; no brand needs to be selected, and the platform refuses anyone who is not an admin or the punished creator themselves.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
punishmentId
The id of the punishment to view, from list-punishments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishment"
],
"properties": {
"punishment": {
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"description": "The punishment",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-punishment",
"title": "View a single punishment",
"description": "View one punishment (discipline) in full by its id, from list-punishments — its type, status, reason in both languages, effective and expiration dates, whether re-verification is allowed, who issued it, and any linked campaign. Admin-only and global; no brand needs to be selected, and the platform refuses anyone who is not an admin or the punished creator themselves.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishmentId"
],
"properties": {
"punishmentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the punishment to view, from list-punishments."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishment"
],
"properties": {
"punishment": {
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"description": "The punishment",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Load one saved creator-sourcing run in full from the standalone sourcing tool: the brand it was sourced for, the casting rubric and bias themes it scored against, what it cost, and its scored creator list (highest fit score first). A run can hold thousands of creators, so the list is capped by `limit` and can be filtered by `minScore`; the total is always reported. Find run ids with list-sourcing-projects. A read — no brand is selected, and it does not spend. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
id
The run's id, from list-sourcing-projects.
Clear enough to supply this argument.
limit
How many creators to return, highest fit score first; the total is reported regardless of the cap.
Clear enough to supply this argument.
minScore
Only return creators whose fit score (the scorer's match rating for this run, higher is a better fit) is at or above this. Omit to include every creator, scored or not.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"author",
"biasTerms",
"brand",
"cost",
"creators",
"id",
"markets",
"name",
"platform",
"poolTotal",
"returned",
"scoredCount",
"totalCreators",
"validated",
"vibeRubric"
],
"properties": {
"id": {
"type": "number",
"description": "The run's id"
},
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini scoring"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the export drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "What the run cost, or null when not recorded"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The run's name, or null"
},
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"sells",
"summary"
],
"properties": {
"sells": {
"type": "string",
"description": "What the brand sells, as read from its website"
},
"summary": {
"type": "string",
"description": "A one-line summary of the brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand the run was sourced for, as read from its website, or null when absent"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The email of the staff member who created the run, or null"
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets (countries) the run targeted"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100, or 0 when the run was never scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country), from their own geo or the run's primary market"
},
"reason": {
"type": "string",
"description": "The scorer's one-line rationale, or empty when the run was never scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The run's creators, highest fit score first, capped at the limit"
},
"platform": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel the run sourced, or null"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit and filter"
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"description": "The bio themes the run's scoring favoured"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators passed validation (email, follower range), or null"
},
"vibeRubric": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The casting rubric the run scored against, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many of the creators carry a fit score, or null"
},
"totalCreators": {
"type": "number",
"description": "How many creators the run holds in total, before the limit and filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-sourcing-project",
"title": "Get a sourcing run",
"description": "Load one saved creator-sourcing run in full from the standalone sourcing tool: the brand it was sourced for, the casting rubric and bias themes it scored against, what it cost, and its scored creator list (highest fit score first). A run can hold thousands of creators, so the list is capped by `limit` and can be filtered by `minScore`; the total is always reported. Find run ids with list-sourcing-projects. A read — no brand is selected, and it does not spend. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The run's id, from list-sourcing-projects."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "How many creators to return, highest fit score first; the total is reported regardless of the cap."
},
"minScore": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Only return creators whose fit score (the scorer's match rating for this run, higher is a better fit) is at or above this. Omit to include every creator, scored or not."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"author",
"biasTerms",
"brand",
"cost",
"creators",
"id",
"markets",
"name",
"platform",
"poolTotal",
"returned",
"scoredCount",
"totalCreators",
"validated",
"vibeRubric"
],
"properties": {
"id": {
"type": "number",
"description": "The run's id"
},
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini scoring"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the export drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "What the run cost, or null when not recorded"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The run's name, or null"
},
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"sells",
"summary"
],
"properties": {
"sells": {
"type": "string",
"description": "What the brand sells, as read from its website"
},
"summary": {
"type": "string",
"description": "A one-line summary of the brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand the run was sourced for, as read from its website, or null when absent"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The email of the staff member who created the run, or null"
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets (countries) the run targeted"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100, or 0 when the run was never scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country), from their own geo or the run's primary market"
},
"reason": {
"type": "string",
"description": "The scorer's one-line rationale, or empty when the run was never scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The run's creators, highest fit score first, capped at the limit"
},
"platform": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel the run sourced, or null"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit and filter"
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"description": "The bio themes the run's scoring favoured"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators passed validation (email, follower range), or null"
},
"vibeRubric": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The casting rubric the run scored against, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many of the creators carry a fit score, or null"
},
"totalCreators": {
"type": "number",
"description": "How many creators the run holds in total, before the limit and filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Report the standalone sourcing tool's live safety state: today's OnSocial spend (tokens, dollars, and how many paid exports were ordered), the prepaid token balance a paid export draws down, and whether the emergency stop is on. Check this before ordering a paid export with source-creators — while the emergency stop is on, exports are refused. A read — no brand is selected, and it does not spend. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"balance",
"dbEnabled",
"paused",
"today"
],
"properties": {
"today": {
"type": "object",
"required": [
"runs",
"tokens",
"usd"
],
"properties": {
"usd": {
"type": "number",
"description": "Today's spend in US dollars"
},
"runs": {
"type": "number",
"description": "How many paid exports were ordered today"
},
"tokens": {
"type": "number",
"description": "OnSocial tokens spent today"
}
},
"description": "Today's OnSocial usage (since midnight UTC)",
"additionalProperties": false
},
"paused": {
"type": "boolean",
"description": "Whether the emergency stop is on — while true, ordering a paid export is refused"
},
"balance": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The prepaid OnSocial token balance a paid export draws down, or null when unknown"
},
"dbEnabled": {
"type": "boolean",
"description": "Whether the sourcing tool has a shared database — false means spend and the stop are not tracked"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-sourcing-usage",
"title": "Get sourcing usage",
"description": "Report the standalone sourcing tool's live safety state: today's OnSocial spend (tokens, dollars, and how many paid exports were ordered), the prepaid token balance a paid export draws down, and whether the emergency stop is on. Check this before ordering a paid export with source-creators — while the emergency stop is on, exports are refused. A read — no brand is selected, and it does not spend. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"balance",
"dbEnabled",
"paused",
"today"
],
"properties": {
"today": {
"type": "object",
"required": [
"runs",
"tokens",
"usd"
],
"properties": {
"usd": {
"type": "number",
"description": "Today's spend in US dollars"
},
"runs": {
"type": "number",
"description": "How many paid exports were ordered today"
},
"tokens": {
"type": "number",
"description": "OnSocial tokens spent today"
}
},
"description": "Today's OnSocial usage (since midnight UTC)",
"additionalProperties": false
},
"paused": {
"type": "boolean",
"description": "Whether the emergency stop is on — while true, ordering a paid export is refused"
},
"balance": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The prepaid OnSocial token balance a paid export draws down, or null when unknown"
},
"dbEnabled": {
"type": "boolean",
"description": "Whether the sourcing tool has a shared database — false means spend and the stop are not tracked"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Read the active subscription for a brand or an agency, with full usage detail: the plan and billing period, payment status and validity window, price paid, per-campaign limits and seats (total and remaining), buyout used, and the plan's feature entitlements. A subscription is always held on the agency, so a brand's plan is read from the agency it belongs to — the agency is named in the result. Give exactly one of brandId or agencyId. A read — no scope needs to be selected. For the buyable catalog instead, use list-plans.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Give this OR brandId, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of a brand, from list-brands. Its subscription is read from the agency the brand belongs to. Give this OR agencyId, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"futureSubscription",
"scope",
"subscription"
],
"properties": {
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id that was read"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the read targeted a brand or an agency"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand or agency name"
}
},
"additionalProperties": false
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency the subscription belongs to (a subscription is always agency-level), or null when none"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil",
"accessToInfluencerNetwork",
"campaignsTotal",
"contentApproval",
"influencersPerCampaign",
"instagramCampaigns",
"invitationsPerCampaign",
"multipleBrands",
"packageCategory",
"pricePaid",
"seatsTotal",
"stripeSubscriptionUrl",
"tiktokCampaigns"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"pricePaid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The price actually paid for the subscription, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"seatsTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total sub-brand seats the plan allows, or null when unlimited"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"campaignsTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total campaigns the plan allows, or null when unlimited"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the plan allows the agency to hold more than one brand"
},
"contentApproval": {
"type": "boolean",
"description": "Whether the plan includes content approval"
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
},
"packageCategory": {
"type": "string",
"description": "The channel the plan covers: INSTAGRAM, TIKTOK, BOTH or NONE"
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether the plan allows TikTok campaigns"
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether the plan allows Instagram campaigns"
},
"stripeSubscriptionUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe dashboard link for the subscription, or null when it is not backed by Stripe"
},
"influencersPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Influencers allowed per campaign, or null when unlimited"
},
"invitationsPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invitations allowed per campaign, or null when unlimited"
},
"accessToInfluencerNetwork": {
"type": "boolean",
"description": "Whether the plan grants access to the influencer network"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The active subscription, or null when there is none"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-subscription",
"title": "Get a subscription",
"description": "Read the active subscription for a brand or an agency, with full usage detail: the plan and billing period, payment status and validity window, price paid, per-campaign limits and seats (total and remaining), buyout used, and the plan's feature entitlements. A subscription is always held on the agency, so a brand's plan is read from the agency it belongs to — the agency is named in the result. Give exactly one of brandId or agencyId. A read — no scope needs to be selected. For the buyable catalog instead, use list-plans.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand, from list-brands. Its subscription is read from the agency the brand belongs to. Give this OR agencyId, not both."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId, not both."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"futureSubscription",
"scope",
"subscription"
],
"properties": {
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id that was read"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the read targeted a brand or an agency"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand or agency name"
}
},
"additionalProperties": false
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency the subscription belongs to (a subscription is always agency-level), or null when none"
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil",
"accessToInfluencerNetwork",
"campaignsTotal",
"contentApproval",
"influencersPerCampaign",
"instagramCampaigns",
"invitationsPerCampaign",
"multipleBrands",
"packageCategory",
"pricePaid",
"seatsTotal",
"stripeSubscriptionUrl",
"tiktokCampaigns"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"pricePaid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The price actually paid for the subscription, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"seatsTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total sub-brand seats the plan allows, or null when unlimited"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"campaignsTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total campaigns the plan allows, or null when unlimited"
},
"multipleBrands": {
"type": "boolean",
"description": "Whether the plan allows the agency to hold more than one brand"
},
"contentApproval": {
"type": "boolean",
"description": "Whether the plan includes content approval"
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
},
"packageCategory": {
"type": "string",
"description": "The channel the plan covers: INSTAGRAM, TIKTOK, BOTH or NONE"
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether the plan allows TikTok campaigns"
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether the plan allows Instagram campaigns"
},
"stripeSubscriptionUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe dashboard link for the subscription, or null when it is not backed by Stripe"
},
"influencersPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Influencers allowed per campaign, or null when unlimited"
},
"invitationsPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invitations allowed per campaign, or null when unlimited"
},
"accessToInfluencerNetwork": {
"type": "boolean",
"description": "Whether the plan grants access to the influencer network"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The active subscription, or null when there is none"
},
"futureSubscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "A subscription scheduled to take effect after the current one, or null when there is none"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Fetch a TikTok-search visibility report by its id — the brand's overall score, its competitors' scores, the per-keyword detail, content gaps and quick wins. Use it to read a finished report, or to retrieve one that create-tiktok-visibility-report or add-tiktok-keywords is still running. In a client with a live report panel the panel does the waiting, so this reads once and returns; in a text client (no panel) the call waits on a short poll and, if the run is not finished, returns a 'call again' note — so call it again with the same id until it returns the finished report. Pass awaitKeywords (the keywords just added) when retrieving after add-tiktok-keywords, whose merge keeps the status at complete so the done-signal is those keywords appearing. Do not schedule a background task or re-prompt. Present the scores and breakdowns as charts. Names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
awaitKeywords
Pass the keywords just added when retrieving after add-tiktok-keywords: that merge keeps the status at complete, so the done-signal is these keywords appearing rather than a status flip. Omit for a normal read or when waiting on a first run.
Clear enough to supply this argument.
reportId
The report's id, as returned by create-tiktok-visibility-report.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "get-tiktok-visibility-report",
"title": "Get a TikTok visibility report",
"description": "Fetch a TikTok-search visibility report by its id — the brand's overall score, its competitors' scores, the per-keyword detail, content gaps and quick wins. Use it to read a finished report, or to retrieve one that create-tiktok-visibility-report or add-tiktok-keywords is still running. In a client with a live report panel the panel does the waiting, so this reads once and returns; in a text client (no panel) the call waits on a short poll and, if the run is not finished, returns a 'call again' note — so call it again with the same id until it returns the finished report. Pass awaitKeywords (the keywords just added) when retrieving after add-tiktok-keywords, whose merge keeps the status at complete so the done-signal is those keywords appearing. Do not schedule a background task or re-prompt. Present the scores and breakdowns as charts. Names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reportId"
],
"properties": {
"reportId": {
"type": "string",
"minLength": 1,
"description": "The report's id, as returned by create-tiktok-visibility-report."
},
"awaitKeywords": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pass the keywords just added when retrieving after add-tiktok-keywords: that merge keeps the status at complete, so the done-signal is these keywords appearing rather than a status flip. Omit for a normal read or when waiting on a first run."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandName",
"createdAt",
"errorMessage",
"region",
"reportId",
"reportUrl",
"resultData",
"status",
"websiteUrl"
],
"properties": {
"region": {
"type": "string",
"description": "The market the report was run for (DE, AT, CH, GB or US)"
},
"status": {
"type": "string",
"description": "The report's lifecycle status: pending, processing, complete or failed"
},
"reportId": {
"type": "string",
"description": "The report's id — use it with get-tiktok-visibility-report, add-tiktok-keywords"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand name once resolved from the website (null until known)"
},
"createdAt": {
"type": "string",
"description": "When the report was created (ISO 8601)"
},
"reportUrl": {
"type": "string",
"description": "A browser link to the full report on tiktok-search.refluenced.com"
},
"resultData": {
"anyOf": [
{
"type": "object",
"required": [
"brandAnalysis",
"brandName",
"brandVisibility",
"competitorNames",
"competitorOverallScores",
"competitorsByProductLine",
"contentGaps",
"ctaUrl",
"keywordScores",
"keywordsByProductLine",
"overallScore",
"productLineScores",
"quickWins"
],
"properties": {
"ctaUrl": {
"type": "string",
"description": "The tool's onboarding call-to-action link for this report"
},
"brandName": {
"type": "string",
"description": "The brand the report is for"
},
"quickWins": {
"type": "array",
"items": {
"type": "object",
"required": [
"bestRank",
"brandScore",
"gap",
"keyword",
"maxCompetitorScore"
],
"properties": {
"gap": {
"type": "number",
"description": "How far the brand trails the strongest competitor on the keyword"
},
"keyword": {
"type": "string",
"description": "The keyword that is an easy opportunity to improve"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's best rank on the keyword, or null"
},
"brandScore": {
"type": "number",
"description": "The brand's current visibility score on the keyword"
},
"maxCompetitorScore": {
"type": "number",
"description": "The strongest competitor's score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords that are the easiest opportunities to improve"
},
"contentGaps": {
"type": "array",
"items": {
"type": "object",
"required": [
"competitorName",
"competitorScore",
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"description": "The keyword where the brand is being beaten"
},
"competitorName": {
"type": "string",
"description": "The competitor outranking the brand on this keyword"
},
"competitorScore": {
"type": "number",
"description": "The competitor's visibility score on the keyword"
}
},
"additionalProperties": false
},
"description": "Keywords where a competitor clearly outranks the brand"
},
"overallScore": {
"type": "number",
"description": "The brand's overall TikTok-search visibility score (0-100)"
},
"brandAnalysis": {
"type": "object",
"required": [
"brandLanguage",
"brandName",
"productLines",
"targetAudience"
],
"properties": {
"brandName": {
"type": "string",
"description": "The brand name inferred from the website"
},
"productLines": {
"type": "array",
"items": {
"type": "object",
"required": [
"isPrimary",
"name",
"positioning",
"priceRange",
"priceTier"
],
"properties": {
"name": {
"type": "string",
"description": "The product line's name"
},
"isPrimary": {
"type": "boolean",
"description": "Whether this is the brand's primary product line"
},
"priceTier": {
"type": "string",
"description": "Price tier: budget, mid, premium or luxury"
},
"priceRange": {
"type": "string",
"description": "The line's price range, e.g. '50-120 CHF'"
},
"positioning": {
"type": "string",
"description": "How the line is positioned"
}
},
"additionalProperties": false
},
"description": "The product lines inferred from the website"
},
"brandLanguage": {
"type": "string",
"description": "The brand's tone and language as inferred from its website"
},
"targetAudience": {
"type": "string",
"description": "The brand's target audience as inferred"
}
},
"description": "What the tool inferred about the brand from its website",
"additionalProperties": false
},
"entityDomains": {
"type": "object",
"description": "Resolved website domain per entity, when known",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"keywordScores": {
"type": "object",
"description": "Per-keyword, per-entity score detail — the heart of the report",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"organicCount",
"score",
"totalViews",
"ugcCount",
"videoCount"
],
"properties": {
"score": {
"type": "number",
"description": "Visibility score for this entity on this keyword (0-100)"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The entity's best (lowest) rank across the keyword's results, or null"
},
"ugcCount": {
"type": "number",
"description": "How many of the videos are creator UGC"
},
"topAuthors": {
"type": "array",
"items": {
"type": "object",
"required": [
"nickname",
"rank",
"type",
"username",
"videoUrl",
"views"
],
"properties": {
"rank": {
"type": "number",
"description": "The video's rank in the keyword's search results (1 = top)"
},
"type": {
"type": "string",
"description": "How the video relates to the entity: ugc, brand, paid_ad or paid_partnership"
},
"views": {
"type": "number",
"description": "The video's view count"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, when mirrored (often stripped from output)"
},
"nickname": {
"type": "string",
"description": "The author's display name"
},
"username": {
"type": "string",
"description": "The author's TikTok handle"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
"description": "The top-ranked videos/authors behind the score"
},
"totalViews": {
"type": "number",
"description": "Total views across the entity's videos for this keyword"
},
"videoCount": {
"type": "number",
"description": "How many of the entity's videos appeared for this keyword"
},
"boostedCount": {
"type": "number",
"description": "How many of the entity's videos were boosted (paid)"
},
"organicCount": {
"type": "number",
"description": "How many of the videos are organic (unpaid)"
},
"brandContentCount": {
"type": "number",
"description": "How many of the videos are the brand's own content"
}
},
"additionalProperties": false
}
}
},
"brandVisibility": {
"type": "object",
"description": "Per-product-line, per-entity visibility — the brand set against its competitors",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "number"
},
{
"type": "object",
"required": [
"bestRank",
"boostedCount",
"brandContentCount",
"score",
"totalViews",
"ugcCount"
],
"properties": {
"score": {
"type": "number"
},
"bestRank": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"ugcCount": {
"type": "number"
},
"totalViews": {
"type": "number"
},
"boostedCount": {
"type": "number"
},
"brandContentCount": {
"type": "number"
}
},
"additionalProperties": false
}
],
"description": "Either a bare visibility score, or a per-entity score object"
}
}
},
"competitorNames": {
"type": "array",
"items": {
"type": "string"
},
"description": "The competitors the brand was scored against"
},
"productLineScores": {
"type": "object",
"description": "The brand's visibility score per product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"required": [
"insufficientData",
"keywordCount",
"score"
],
"properties": {
"score": {
"type": "number",
"description": "The line's aggregate visibility score (0-100)"
},
"keywordCount": {
"type": "number",
"description": "How many keywords fed the line's score"
},
"insufficientData": {
"type": "boolean",
"description": "Whether too little data was found to score the line reliably"
}
},
"additionalProperties": false
}
},
"keywordsByProductLine": {
"type": "object",
"description": "Which keywords were searched for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorOverallScores": {
"type": "object",
"description": "Each competitor's overall visibility score (0-100)",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"suggestedKeywordsByLine": {
"type": "object",
"description": "Additional keywords the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"competitorsByProductLine": {
"type": "object",
"description": "Which competitors matter for each product line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"suggestedCompetitorsByLine": {
"type": "object",
"description": "Additional competitors the tool suggests, per line",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full scored report, or null while pending or on failure"
},
"websiteUrl": {
"type": "string",
"description": "The website the report analyses"
},
"errorMessage": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The failure reason when status is failed, else null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Read the platform's current creator-verification requirements catalog — the follower minimums and target-region rules shared by both channels, Instagram's follower-band engagement thresholds, TikTok's video counts, and the cool-down periods before a rejected creator may reapply. A public read; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Invite someone to an agency by email. Agency membership carries no per-role permission level (that exists only at the brand level). It is preview-then-confirm, since it emails the person; the preview names the agency. Target the agency by agencyId; no scope needs to be selected. If the email already has a Refluenced account they are added directly (and to the agency's brands), otherwise an invitation email is sent. The platform enforces who may invite and every rule (an influencer, or someone already in another agency, is refused); any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of the agency to invite the member to, from list-agencies, list-brands or list-agency-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"detail",
"invited",
"performed",
"token"
],
"properties": {
"token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The activation token from the emailed link, when a fresh invitation was sent; otherwise null."
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was sent"
},
"detail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The platform's result code — invite_sent, user_added_to_agency, or invite_email_resent — or null for a preview where nothing was sent yet."
},
"invited": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The invited email address"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The invitation once sent, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was sent (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "invite-agency-member",
"title": "Invite an agency member",
"description": "Invite someone to an agency by email. Agency membership carries no per-role permission level (that exists only at the brand level). It is preview-then-confirm, since it emails the person; the preview names the agency. Target the agency by agencyId; no scope needs to be selected. If the email already has a Refluenced account they are added directly (and to the agency's brands), otherwise an invitation email is sent. The platform enforces who may invite and every rule (an influencer, or someone already in another agency, is refused); any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The email address to invite."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to invite the member to, from list-agencies, list-brands or list-agency-members."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"detail",
"invited",
"performed",
"token"
],
"properties": {
"token": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The activation token from the emailed link, when a fresh invitation was sent; otherwise null."
},
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was sent"
},
"detail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The platform's result code — invite_sent, user_added_to_agency, or invite_email_resent — or null for a preview where nothing was sent yet."
},
"invited": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The invited email address"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The invitation once sent, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was sent (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Invite someone to a brand by email at a chosen permission level — view only (READ), purchase only (PURCHASE), or full permissions (WRITE). Ownership is not invitable: invite the person at one of these levels, then transfer ownership with set-brand-member-role once they have joined. It is preview-then-confirm, since it emails the person; the preview names the brand. Target the brand by brandId; no brand needs to be selected. If the email already has a Refluenced account they are added directly, otherwise an invitation email is sent. The platform enforces who may invite and every rule (an influencer or an existing agency member is refused); any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand to invite the member to, from list-brands, get-brand or list-brand-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
email
The email address to invite.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
role
The permission level to invite at: READ (view only), PURCHASE (purchase only), or WRITE (full permissions).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"detail",
"invited",
"performed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was sent"
},
"detail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The platform's result code — invite_sent, user_added_to_sub_brand, or invite_email_resent — or null for a preview where nothing was sent yet."
},
"invited": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"role"
],
"properties": {
"role": {
"enum": [
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The permission level the invitee will get"
},
"email": {
"type": "string",
"description": "The invited email address"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The invitation once sent, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was sent (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "invite-brand-member",
"title": "Invite a brand member",
"description": "Invite someone to a brand by email at a chosen permission level — view only (READ), purchase only (PURCHASE), or full permissions (WRITE). Ownership is not invitable: invite the person at one of these levels, then transfer ownership with set-brand-member-role once they have joined. It is preview-then-confirm, since it emails the person; the preview names the brand. Target the brand by brandId; no brand needs to be selected. If the email already has a Refluenced account they are added directly, otherwise an invitation email is sent. The platform enforces who may invite and every rule (an influencer or an existing agency member is refused); any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"email"
],
"properties": {
"role": {
"enum": [
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"default": "READ",
"description": "The permission level to invite at: READ (view only), PURCHASE (purchase only), or WRITE (full permissions)."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "The email address to invite."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to invite the member to, from list-brands, get-brand or list-brand-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"detail",
"invited",
"performed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was sent"
},
"detail": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The platform's result code — invite_sent, user_added_to_sub_brand, or invite_email_resent — or null for a preview where nothing was sent yet."
},
"invited": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"role"
],
"properties": {
"role": {
"enum": [
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The permission level the invitee will get"
},
"email": {
"type": "string",
"description": "The invited email address"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The invitation once sent, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was sent (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Invite one or more creators to a campaign so they can apply. Pass the userIds from search-influencer-network or list-invitable-creators — one, or a whole selection at once. This mirrors the one-click invite in the web app, so it applies directly without a separate confirmation. The platform enforces the campaign's invite limit and returns no_invites_left_for_campaign once it is reached; any creator that cannot be invited is reported rather than hidden.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign to invite creators to.
Clear enough to supply this argument.
userIds
The user ids of the creators to invite, from search-influencer-network or list-invitable-creators (the userId field). Pass several to invite a whole selection at once.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"failed",
"invited",
"performed",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"reason",
"userId"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this invite"
},
"userId": {
"type": "number",
"description": "The creator that could not be invited"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be invited, reported rather than hidden"
},
"invited": {
"type": "array",
"items": {
"type": "number"
},
"description": "The user ids of the creators that were invited"
},
"performed": {
"type": "boolean",
"description": "Whether any invite was sent — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many creators the request asked to invite"
},
"campaignId": {
"type": "number",
"description": "The campaign the creators were invited to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "invite-creators",
"title": "Invite creators to a campaign",
"description": "Invite one or more creators to a campaign so they can apply. Pass the userIds from search-influencer-network or list-invitable-creators — one, or a whole selection at once. This mirrors the one-click invite in the web app, so it applies directly without a separate confirmation. The platform enforces the campaign's invite limit and returns no_invites_left_for_campaign once it is reached; any creator that cannot be invited is reported rather than hidden.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"userIds"
],
"properties": {
"userIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"maxItems": 100,
"minItems": 1,
"description": "The user ids of the creators to invite, from search-influencer-network or list-invitable-creators (the userId field). Pass several to invite a whole selection at once."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to invite creators to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"failed",
"invited",
"performed",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"reason",
"userId"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this invite"
},
"userId": {
"type": "number",
"description": "The creator that could not be invited"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be invited, reported rather than hidden"
},
"invited": {
"type": "array",
"items": {
"type": "number"
},
"description": "The user ids of the creators that were invited"
},
"performed": {
"type": "boolean",
"description": "Whether any invite was sent — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many creators the request asked to invite"
},
"campaignId": {
"type": "number",
"description": "The campaign the creators were invited to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Invite an influencer group (from list-groups) to an already-published, open campaign — this sends invitations to every eligible member immediately, so it is outward-facing and preview-then-confirm: called with confirm false (the default) it previews, naming the brand, the group, the campaign, and how many members will be invited; set confirm true to send. For a DRAFT campaign use invite-group-to-draft-campaign instead — this path refuses a campaign that is not open for invites (campaign_not_open_for_invites), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the open, published campaign to invite the group to.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId",
"invited",
"preview"
],
"properties": {
"groupId": {
"type": "number",
"description": "The group that was invited"
},
"invited": {
"type": "boolean",
"description": "Whether the invitations were sent (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen — the brand, group, campaign and eligible member count — to state back to the user; null once the invitations are sent."
},
"campaignId": {
"type": "number",
"description": "The campaign the group was invited to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "invite-group-to-campaign",
"title": "Invite a group to a live campaign",
"description": "Invite an influencer group (from list-groups) to an already-published, open campaign — this sends invitations to every eligible member immediately, so it is outward-facing and preview-then-confirm: called with confirm false (the default) it previews, naming the brand, the group, the campaign, and how many members will be invited; set confirm true to send. For a DRAFT campaign use invite-group-to-draft-campaign instead — this path refuses a campaign that is not open for invites (campaign_not_open_for_invites), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to invite, from list-groups."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the open, published campaign to invite the group to."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId",
"invited",
"preview"
],
"properties": {
"groupId": {
"type": "number",
"description": "The group that was invited"
},
"invited": {
"type": "boolean",
"description": "Whether the invitations were sent (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen — the brand, group, campaign and eligible member count — to state back to the user; null once the invitations are sent."
},
"campaignId": {
"type": "number",
"description": "The campaign the group was invited to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Attach an influencer group (from list-groups) to a DRAFT campaign, to be invited when the campaign is published. This is the draft path and sends nothing yet, so it applies directly; for an already-published campaign use invite-group-to-campaign, which invites immediately. Invite the whole group, or a subset — either specific members (influencerUuids) or the members matching filters, not both. The platform refuses if the campaign is not a draft (campaign_not_draft) or the group is already attached (group_already_invited), surfaced as-is. Adjust the attached subset later with edit-draft-campaign-group-invite, or detach with remove-group-from-draft-campaign.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the draft campaign to attach the group to.
Clear enough to supply this argument.
filters › channel
Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel.
Clear enough to supply this argument.
filters › countries
Only members based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
filters › cutoffValue
Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › engagementMax
Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
filters › engagementMin
Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
filters › followersMax
Only members with at most this many followers.
Clear enough to supply this argument.
filters › followersMin
Only members with at least this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › gender
Only members of this gender.
Clear enough to supply this argument.
filters › interests
Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests).
Clear enough to supply this argument.
filters › medianViewsMax
Only members with at most this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › medianViewsMin
Only members with at least this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filters › ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Clear enough to supply this argument.
filters › punishmentType
Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins.
Clear enough to supply this argument.
filters › search
Filter members by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
filters › vibe
Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'.
Clear enough to supply this argument.
groupId
The id of the group to attach, from list-groups.
Clear enough to supply this argument.
influencerUuids
Invite only these specific members, by influencer profile id (a subset of the group). Mutually exclusive with filters; omit both to invite the whole group.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId",
"mode"
],
"properties": {
"mode": {
"enum": [
"filtered",
"selected_members",
"whole_group"
],
"type": "string",
"description": "Whether the whole group, a chosen subset, or the members matching filters will be invited"
},
"groupId": {
"type": "number",
"description": "The group that was attached"
},
"campaignId": {
"type": "number",
"description": "The draft campaign the group was attached to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "invite-group-to-draft-campaign",
"title": "Attach a group to a draft campaign",
"description": "Attach an influencer group (from list-groups) to a DRAFT campaign, to be invited when the campaign is published. This is the draft path and sends nothing yet, so it applies directly; for an already-published campaign use invite-group-to-campaign, which invites immediately. Invite the whole group, or a subset — either specific members (influencerUuids) or the members matching filters, not both. The platform refuses if the campaign is not a draft (campaign_not_draft) or the group is already attached (group_already_invited), surfaced as-is. Adjust the attached subset later with edit-draft-campaign-group-invite, or detach with remove-group-from-draft-campaign.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId"
],
"properties": {
"filters": {
"type": "object",
"properties": {
"vibe": {
"type": "string",
"description": "Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only members of this gender."
},
"search": {
"type": "string",
"description": "Filter members by name, Instagram handle or TikTok handle."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests)."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many followers."
},
"engagementMax": {
"type": "number",
"description": "Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"engagementMin": {
"type": "number",
"description": "Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins."
}
},
"description": "Invite only the group's members matching these filters (same controls as list-group-influencers). Mutually exclusive with influencerUuids; omit both to invite the whole group."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to attach, from list-groups."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the draft campaign to attach the group to."
},
"influencerUuids": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "Invite only these specific members, by influencer profile id (a subset of the group). Mutually exclusive with filters; omit both to invite the whole group."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId",
"mode"
],
"properties": {
"mode": {
"enum": [
"filtered",
"selected_members",
"whole_group"
],
"type": "string",
"description": "Whether the whole group, a chosen subset, or the members matching filters will be invited"
},
"groupId": {
"type": "number",
"description": "The group that was attached"
},
"campaignId": {
"type": "number",
"description": "The draft campaign the group was attached to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Issue a punishment (discipline) to a creator — an un-verification or a ban — with a bilingual reason. This is outward-facing: it notifies the creator and, for an un-verify, withdraws their pending applications on that channel, so it is preview-then-confirm. Target the creator by userId; no brand is selected, and the punishment names the creator it falls on. Admin-only — the platform refuses a non-admin and enforces every rule (both-language reason required; punishmentDays required for TIMED_BAN/PROBATION and for a re-verifiable un-verify; no duplicate active punishment of a type; a permanent ban is terminal); any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bodyDe
The reason body shown to the creator, in German.
Clear enough to supply this argument.
bodyEn
The reason body shown to the creator, in English.
Clear enough to supply this argument.
campaignApplicationId
Optionally tie this to the offending application by its id — it must belong to the creator.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
creatorName
The creator's name or handle, used to name them in the confirmation preview (from search-influencer-network or list-invitable-creators); omit to refer to them only by user id.
Clear enough to supply this argument.
punishmentDays
How many days the punishment lasts. The platform requires it for TIMED_BAN and PROBATION, and for an un-verify when reVerificationAllowed is set. Omit for a permanent or indefinite punishment.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentType
The kind of punishment: an un-verify (UN_VERIFIED_INSTAGRAM/TIKTOK/UGC) strips a channel verification; the ban ladder is PROBATION, TIMED_BAN, then PERMANENT_BAN.
Clear enough to supply this argument.
reVerificationAllowed
Un-verify family only: whether the creator may re-verify after punishmentDays. Requires punishmentDays.
Clear enough to supply this argument.
templateId
A reason template id from list-punishment-templates — its type must match punishmentType. Omit to supply the reason text directly without a template.
Clear enough to supply this argument.
titleDe
The reason title shown to the creator, in German.
Clear enough to supply this argument.
titleEn
The reason title shown to the creator, in English.
Clear enough to supply this argument.
userId
The user-account (BaseUser) id of the creator to punish — the userId field from search-influencer-network or list-invitable-creators, NOT the profile id/uuid.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator the punishment was issued against"
},
"performed": {
"type": "boolean",
"description": "Whether the punishment was issued"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment that was created, re-read after issuing, or null when it could not be located on the first page of the creator's history (use list-punishments to find it)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "issue-punishment",
"title": "Issue a punishment to a creator",
"description": "Issue a punishment (discipline) to a creator — an un-verification or a ban — with a bilingual reason. This is outward-facing: it notifies the creator and, for an un-verify, withdraws their pending applications on that channel, so it is preview-then-confirm. Target the creator by userId; no brand is selected, and the punishment names the creator it falls on. Admin-only — the platform refuses a non-admin and enforces every rule (both-language reason required; punishmentDays required for TIMED_BAN/PROBATION and for a re-verifiable un-verify; no duplicate active punishment of a type; a permanent ban is terminal); any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bodyDe",
"bodyEn",
"punishmentType",
"titleDe",
"titleEn",
"userId"
],
"properties": {
"bodyDe": {
"type": "string",
"minLength": 1,
"description": "The reason body shown to the creator, in German."
},
"bodyEn": {
"type": "string",
"minLength": 1,
"description": "The reason body shown to the creator, in English."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The user-account (BaseUser) id of the creator to punish — the userId field from search-influencer-network or list-invitable-creators, NOT the profile id/uuid."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"titleDe": {
"type": "string",
"minLength": 1,
"description": "The reason title shown to the creator, in German."
},
"titleEn": {
"type": "string",
"minLength": 1,
"description": "The reason title shown to the creator, in English."
},
"templateId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "A reason template id from list-punishment-templates — its type must match punishmentType. Omit to supply the reason text directly without a template."
},
"creatorName": {
"type": "string",
"description": "The creator's name or handle, used to name them in the confirmation preview (from search-influencer-network or list-invitable-creators); omit to refer to them only by user id."
},
"punishmentDays": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "How many days the punishment lasts. The platform requires it for TIMED_BAN and PROBATION, and for an un-verify when reVerificationAllowed is set. Omit for a permanent or indefinite punishment."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "The kind of punishment: an un-verify (UN_VERIFIED_INSTAGRAM/TIKTOK/UGC) strips a channel verification; the ban ladder is PROBATION, TIMED_BAN, then PERMANENT_BAN."
},
"campaignApplicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Optionally tie this to the offending application by its id — it must belong to the creator."
},
"reVerificationAllowed": {
"type": "boolean",
"default": false,
"description": "Un-verify family only: whether the creator may re-verify after punishmentDays. Requires punishmentDays."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"punishment",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator the punishment was issued against"
},
"performed": {
"type": "boolean",
"description": "Whether the punishment was issued"
},
"punishment": {
"anyOf": [
{
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The punishment that was created, re-read after issuing, or null when it could not be located on the first page of the creator's history (use list-punishments to find it)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Toggle whether a creator's Instagram, TikTok, source or UGC media is liked by the brand — liking it if it isn't, unliking it if it is. This mirrors the web's one-click like, so it applies directly, and it returns whether the media ended up liked. Target it by mediaId + mediaType (from list-campaign-media or list-ugc-media); no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
mediaId
The id of the media to like or unlike, from list-campaign-media (Instagram/TikTok/source) or list-ugc-media (UGC).
Clear enough to supply this argument.
mediaType
The media's channel.
Explain the meaning of this value, not just its name.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"liked",
"mediaId",
"mediaType",
"performed"
],
"properties": {
"liked": {
"type": "boolean",
"description": "Whether the media is now liked (true) or unliked (false) after the toggle"
},
"mediaId": {
"type": "number",
"description": "The media whose liked state was toggled"
},
"mediaType": {
"type": "string",
"description": "The media's channel"
},
"performed": {
"type": "boolean",
"description": "Whether the toggle was applied — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "like-media",
"title": "Like or unlike a media piece",
"description": "Toggle whether a creator's Instagram, TikTok, source or UGC media is liked by the brand — liking it if it isn't, unliking it if it is. This mirrors the web's one-click like, so it applies directly, and it returns whether the media ended up liked. Target it by mediaId + mediaType (from list-campaign-media or list-ugc-media); no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"mediaType"
],
"properties": {
"mediaId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the media to like or unlike, from list-campaign-media (Instagram/TikTok/source) or list-ugc-media (UGC)."
},
"mediaType": {
"enum": [
"INSTAGRAM",
"SOURCE",
"TIKTOK",
"UGC"
],
"type": "string",
"description": "The media's channel."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"liked",
"mediaId",
"mediaType",
"performed"
],
"properties": {
"liked": {
"type": "boolean",
"description": "Whether the media is now liked (true) or unliked (false) after the toggle"
},
"mediaId": {
"type": "number",
"description": "The media whose liked state was toggled"
},
"mediaType": {
"type": "string",
"description": "The media's channel"
},
"performed": {
"type": "boolean",
"description": "Whether the toggle was applied — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the TikTok Spark / Instagram Partnership ad codes on a campaign's synced content, with whether each has been boosted (used) yet, and the deep link to the external ad manager where a code is pasted to boost it. Use filter=unused to see the codes still to action. Only meaningful when the campaign runs spark or partnership ads — otherwise it says so. To mark a code boosted use boost-content; to set a missing code use set-ad-code. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose ad codes to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filter
Which codes to return: all, boosted (already used), unused (set but not yet boosted — the ones still to action), or missing (eligible content with no code set yet).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adType",
"adsManagerUrl",
"campaignId",
"codes",
"enabled",
"summary",
"truncated",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's reporting page in the Refluenced web app"
},
"codes": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"format",
"influencer",
"lastCopiedAt",
"mediaId",
"permalink",
"platform",
"status",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the code has been boosted/copied at least once"
},
"format": {
"type": "string",
"description": "The media format the code is on: POST, REEL or TIKTOK"
},
"status": {
"type": "string",
"description": "The code's state: boosted (already used), unused (set but not yet boosted), or missing (no code set)"
},
"mediaId": {
"type": "number",
"description": "The media's id — pass to boost-content to mark the code boosted"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code, or null if the creator has not set one"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"profileUrl",
"userId",
"username"
],
"properties": {
"name": {
"type": "string",
"description": "The creator's display name"
},
"userId": {
"type": "number",
"description": "The creator's user id"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's handle, or null"
},
"profileUrl": {
"type": "string",
"description": "The creator's profile in the Refluenced web app"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator whose content carries the code, or null if their profile is missing"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the code was last boosted/copied, or null if never"
},
"applicationId": {
"type": "number",
"description": "The application id, for per-creator tools"
}
},
"additionalProperties": false
},
"description": "The matching ad codes"
},
"adType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's ad type: spark_ad (TikTok), partnership_ad (Instagram), or null if none is enabled"
},
"enabled": {
"type": "boolean",
"description": "Whether the campaign runs any spark or partnership ads"
},
"summary": {
"type": "object",
"required": [
"boosted",
"missing",
"total",
"unused"
],
"properties": {
"total": {
"type": "number",
"description": "Total eligible content pieces"
},
"unused": {
"type": "number",
"description": "Codes set but not yet boosted"
},
"boosted": {
"type": "number",
"description": "Codes already boosted/used"
},
"missing": {
"type": "number",
"description": "Eligible content with no code set yet"
}
},
"description": "Counts across all eligible content (before the filter is applied)",
"additionalProperties": false
},
"truncated": {
"type": "boolean",
"description": "Whether more content exists than was fetched (very large campaigns)"
},
"campaignId": {
"type": "number",
"description": "The campaign these codes belong to"
},
"adsManagerUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the external ad manager where the code is pasted to boost, or null when no ads are enabled"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-ad-codes",
"title": "List a campaign's spark and partnership ad codes",
"description": "List the TikTok Spark / Instagram Partnership ad codes on a campaign's synced content, with whether each has been boosted (used) yet, and the deep link to the external ad manager where a code is pasted to boost it. Use filter=unused to see the codes still to action. Only meaningful when the campaign runs spark or partnership ads — otherwise it says so. To mark a code boosted use boost-content; to set a missing code use set-ad-code. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"filter": {
"enum": [
"all",
"boosted",
"missing",
"unused"
],
"type": "string",
"default": "all",
"description": "Which codes to return: all, boosted (already used), unused (set but not yet boosted — the ones still to action), or missing (eligible content with no code set yet)."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose ad codes to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adType",
"adsManagerUrl",
"campaignId",
"codes",
"enabled",
"summary",
"truncated",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's reporting page in the Refluenced web app"
},
"codes": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"format",
"influencer",
"lastCopiedAt",
"mediaId",
"permalink",
"platform",
"status",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the code has been boosted/copied at least once"
},
"format": {
"type": "string",
"description": "The media format the code is on: POST, REEL or TIKTOK"
},
"status": {
"type": "string",
"description": "The code's state: boosted (already used), unused (set but not yet boosted), or missing (no code set)"
},
"mediaId": {
"type": "number",
"description": "The media's id — pass to boost-content to mark the code boosted"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code, or null if the creator has not set one"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"name",
"profileUrl",
"userId",
"username"
],
"properties": {
"name": {
"type": "string",
"description": "The creator's display name"
},
"userId": {
"type": "number",
"description": "The creator's user id"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's handle, or null"
},
"profileUrl": {
"type": "string",
"description": "The creator's profile in the Refluenced web app"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator whose content carries the code, or null if their profile is missing"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the code was last boosted/copied, or null if never"
},
"applicationId": {
"type": "number",
"description": "The application id, for per-creator tools"
}
},
"additionalProperties": false
},
"description": "The matching ad codes"
},
"adType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's ad type: spark_ad (TikTok), partnership_ad (Instagram), or null if none is enabled"
},
"enabled": {
"type": "boolean",
"description": "Whether the campaign runs any spark or partnership ads"
},
"summary": {
"type": "object",
"required": [
"boosted",
"missing",
"total",
"unused"
],
"properties": {
"total": {
"type": "number",
"description": "Total eligible content pieces"
},
"unused": {
"type": "number",
"description": "Codes set but not yet boosted"
},
"boosted": {
"type": "number",
"description": "Codes already boosted/used"
},
"missing": {
"type": "number",
"description": "Eligible content with no code set yet"
}
},
"description": "Counts across all eligible content (before the filter is applied)",
"additionalProperties": false
},
"truncated": {
"type": "boolean",
"description": "Whether more content exists than was fetched (very large campaigns)"
},
"campaignId": {
"type": "number",
"description": "The campaign these codes belong to"
},
"adsManagerUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the external ad manager where the code is pasted to boost, or null when no ads are enabled"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the admin overview — the staff-curated directory of every internal tool, dashboard, and admin page, grouped into categories, each link carrying a url, an optional audience side (brand, influencer, or both), and a description. Use it to answer 'what's the link to X'. The whole shared directory comes back in one call, in sort order. Category and link ids are surfaced for editing with the create/edit/delete admin-link tools. Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categories",
"categoryCount",
"linkCount"
],
"properties": {
"linkCount": {
"type": "number",
"description": "How many links there are across all categories"
},
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The link categories, in sort order, each with its links"
},
"categoryCount": {
"type": "number",
"description": "How many categories there are"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-admin-links",
"title": "List admin links",
"description": "List the admin overview — the staff-curated directory of every internal tool, dashboard, and admin page, grouped into categories, each link carrying a url, an optional audience side (brand, influencer, or both), and a description. Use it to answer 'what's the link to X'. The whole shared directory comes back in one call, in sort order. Category and link ids are surfaced for editing with the create/edit/delete admin-link tools. Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categories",
"categoryCount",
"linkCount"
],
"properties": {
"linkCount": {
"type": "number",
"description": "How many links there are across all categories"
},
"categories": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"isProtected",
"links",
"name",
"order"
],
"properties": {
"id": {
"type": "number",
"description": "The category's id, used to edit or delete it and to create links in it"
},
"name": {
"type": "string",
"description": "The category's name"
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"categoryId",
"description",
"id",
"isProtected",
"order",
"side",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The link's id, used to edit or delete it"
},
"url": {
"type": "string",
"description": "The link's URL"
},
"side": {
"anyOf": [
{
"enum": [
"brand",
"influencer"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The audience the link is relevant to, or null for both"
},
"order": {
"type": "number",
"description": "The link's sort position within its category (ascending)"
},
"title": {
"type": "string",
"description": "The link's display title"
},
"categoryId": {
"type": "number",
"description": "The id of the category this link belongs to"
},
"description": {
"type": "string",
"description": "What the link is for (may be empty)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the link is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The links in this category, in sort order"
},
"order": {
"type": "number",
"description": "The category's sort position (ascending)"
},
"isProtected": {
"type": "boolean",
"description": "Whether the category is protected — editable but cannot be deleted"
}
},
"additionalProperties": false
},
"description": "The link categories, in sort order, each with its links"
},
"categoryCount": {
"type": "number",
"description": "How many categories there are"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List the agencies you may work with. Search by agency name, filter by subscription (plan status, how it was assigned, plan tier, and social channel access), and page through the results. Use this to find an agency's id before selecting it with select-agency, or before scoping list-brands and list-campaigns to an agency. Only Refluenced administrators may list agencies; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
activeSubscription
Filter by the agency's plan status: true keeps only agencies whose subscription is currently within its valid window, false only those whose subscription has lapsed.
Clear enough to supply this argument.
adminAssigned
Filter by how the agency's subscription was assigned: true keeps only staff-assigned (admin) subscriptions, false only self-purchased (Stripe) ones.
Clear enough to supply this argument.
instagramPackage
When true, keep only agencies whose plan grants Instagram campaigns.
Clear enough to supply this argument.
packageName
Filter to agencies on this exact plan tier (ENTERPRISE is labelled 'Tailored' in the web app).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return. Each page holds up to 12 agencies; request the next page while hasMore is true.
Clear enough to supply this argument.
search
Narrow the list to agencies whose name matches this text.
Clear enough to supply this argument.
tiktokPackage
When true, keep only agencies whose plan grants TikTok campaigns.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencies",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total agencies matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"agencies": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id, passed to select-agency or as agencyId to the list tools"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is on file"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is on file"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is on file"
}
},
"additionalProperties": false
},
"description": "The agencies on this page of results"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-agencies",
"title": "List agencies",
"description": "List the agencies you may work with. Search by agency name, filter by subscription (plan status, how it was assigned, plan tier, and social channel access), and page through the results. Use this to find an agency's id before selecting it with select-agency, or before scoping list-brands and list-campaigns to an agency. Only Refluenced administrators may list agencies; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return. Each page holds up to 12 agencies; request the next page while hasMore is true."
},
"search": {
"type": "string",
"description": "Narrow the list to agencies whose name matches this text."
},
"packageName": {
"enum": [
"ADVANCED",
"ENTERPRISE",
"ESSENTIALS",
"EXPERT",
"PROFESSIONAL",
"STARTER"
],
"type": "string",
"description": "Filter to agencies on this exact plan tier (ENTERPRISE is labelled 'Tailored' in the web app)."
},
"adminAssigned": {
"type": "boolean",
"description": "Filter by how the agency's subscription was assigned: true keeps only staff-assigned (admin) subscriptions, false only self-purchased (Stripe) ones."
},
"tiktokPackage": {
"type": "boolean",
"description": "When true, keep only agencies whose plan grants TikTok campaigns."
},
"instagramPackage": {
"type": "boolean",
"description": "When true, keep only agencies whose plan grants Instagram campaigns."
},
"activeSubscription": {
"type": "boolean",
"description": "Filter by the agency's plan status: true keeps only agencies whose subscription is currently within its valid window, false only those whose subscription has lapsed."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencies",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total agencies matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"agencies": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id, passed to select-agency or as agencyId to the list tools"
},
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's city, or null when none is on file"
},
"name": {
"type": "string",
"description": "The agency's name"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's country, or null when none is on file"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency's website, or null when none is on file"
}
},
"additionalProperties": false
},
"description": "The agencies on this page of results"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List an agency's current members — each marked owner or admin — and every invitation on the agency, pending or resolved. Agency membership carries no per-role permission level (that exists only at the brand level). A read — no scope needs to be selected. Only Refluenced administrators, or a member of the agency, may read this; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of the agency whose members to read, from list-agencies or list-brands.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"invites",
"members"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and none was read"
},
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"created",
"email",
"id",
"invitedBy",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The invitation's id"
},
"email": {
"type": "string",
"description": "The invited email address"
},
"status": {
"type": "string",
"description": "The invitation's status: PENDING, ACCEPTED, or REJECTED"
},
"created": {
"type": "string",
"description": "When the invitation was created (ISO 8601)"
},
"invitedBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of whoever sent the invitation, or null"
}
},
"additionalProperties": false
},
"description": "Every invitation on the agency, of any status — filter on status PENDING for the outstanding ones"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"adminAccess",
"created",
"id",
"owner",
"user"
],
"properties": {
"id": {
"type": "number",
"description": "The membership record's own id — not the member's user id; set-brand-member-role, remove-brand-member and remove-agency-member take the user id (user.id) instead."
},
"user": {
"type": "object",
"required": [
"email",
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id — pass it to set-brand-member-role, remove-brand-member or remove-agency-member"
},
"email": {
"type": "string",
"description": "The member's email"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's last name, or null when not set"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's first name, or null when not set"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the member's profile picture, or null when none is set"
}
},
"description": "The member's user account",
"additionalProperties": false
},
"owner": {
"type": "boolean",
"description": "Whether the member is the agency's owner"
},
"created": {
"type": "string",
"description": "When the member was added (ISO 8601)"
},
"adminAccess": {
"type": "boolean",
"description": "Whether the member has admin access to the agency"
}
},
"additionalProperties": false
},
"description": "The agency's current members"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-agency-members",
"title": "List an agency's members",
"description": "List an agency's current members — each marked owner or admin — and every invitation on the agency, pending or resolved. Agency membership carries no per-role permission level (that exists only at the brand level). A read — no scope needs to be selected. Only Refluenced administrators, or a member of the agency, may read this; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId"
],
"properties": {
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency whose members to read, from list-agencies or list-brands."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"invites",
"members"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and none was read"
},
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"created",
"email",
"id",
"invitedBy",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The invitation's id"
},
"email": {
"type": "string",
"description": "The invited email address"
},
"status": {
"type": "string",
"description": "The invitation's status: PENDING, ACCEPTED, or REJECTED"
},
"created": {
"type": "string",
"description": "When the invitation was created (ISO 8601)"
},
"invitedBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of whoever sent the invitation, or null"
}
},
"additionalProperties": false
},
"description": "Every invitation on the agency, of any status — filter on status PENDING for the outstanding ones"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"adminAccess",
"created",
"id",
"owner",
"user"
],
"properties": {
"id": {
"type": "number",
"description": "The membership record's own id — not the member's user id; set-brand-member-role, remove-brand-member and remove-agency-member take the user id (user.id) instead."
},
"user": {
"type": "object",
"required": [
"email",
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id — pass it to set-brand-member-role, remove-brand-member or remove-agency-member"
},
"email": {
"type": "string",
"description": "The member's email"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's last name, or null when not set"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's first name, or null when not set"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the member's profile picture, or null when none is set"
}
},
"description": "The member's user account",
"additionalProperties": false
},
"owner": {
"type": "boolean",
"description": "Whether the member is the agency's owner"
},
"created": {
"type": "string",
"description": "When the member was added (ISO 8601)"
},
"adminAccess": {
"type": "boolean",
"description": "Whether the member has admin access to the agency"
}
},
"additionalProperties": false
},
"description": "The agency's current members"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List a brand's saved payment methods (cards, and others like Link or PayPal) from Stripe, each with its id for set-agency-default-card / detach-agency-card. Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. They come back in the platform's order: the default first, then other active methods, then any past expiry. The first card is the default — it is flagged with default: true and marked in the text, so state it plainly rather than hedging. A brand with no Stripe customer returns an empty list. The platform gates access and surfaces any refusal as-is.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Give this OR brandId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand whose saved payment cards to list, from list-brands. Give this OR agencyId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cards"
],
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"required": [
"brand",
"default",
"expMonth",
"expYear",
"id",
"last4",
"type"
],
"properties": {
"id": {
"type": "string",
"description": "The Stripe payment-method id (pm_…), used with set-agency-default-card / detach-agency-card"
},
"type": {
"type": "string",
"description": "The payment-method type: 'card', 'link', 'paypal', 'klarna', etc."
},
"brand": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The card network (e.g. 'visa', 'mastercard'), or null for a non-card method"
},
"last4": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The card's last four digits, or null for a non-card method"
},
"default": {
"type": "boolean",
"description": "Whether this is the account's default payment method — the platform returns the default first"
},
"expYear": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The card's expiry year, or null for a non-card method"
},
"expMonth": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The card's expiry month (1-12), or null for a non-card method"
}
},
"additionalProperties": false
},
"description": "The saved payment methods, the default first (flagged default: true), then active, then expired"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-agency-payment-cards",
"title": "List a brand's or agency's payment methods",
"description": "List a brand's saved payment methods (cards, and others like Link or PayPal) from Stripe, each with its id for set-agency-default-card / detach-agency-card. Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. They come back in the platform's order: the default first, then other active methods, then any past expiry. The first card is the default — it is flagged with default: true and marked in the text, so state it plainly rather than hedging. A brand with no Stripe customer returns an empty list. The platform gates access and surfaces any refusal as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose saved payment cards to list, from list-brands. Give this OR agencyId."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cards"
],
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"required": [
"brand",
"default",
"expMonth",
"expYear",
"id",
"last4",
"type"
],
"properties": {
"id": {
"type": "string",
"description": "The Stripe payment-method id (pm_…), used with set-agency-default-card / detach-agency-card"
},
"type": {
"type": "string",
"description": "The payment-method type: 'card', 'link', 'paypal', 'klarna', etc."
},
"brand": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The card network (e.g. 'visa', 'mastercard'), or null for a non-card method"
},
"last4": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The card's last four digits, or null for a non-card method"
},
"default": {
"type": "boolean",
"description": "Whether this is the account's default payment method — the platform returns the default first"
},
"expYear": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The card's expiry year, or null for a non-card method"
},
"expMonth": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The card's expiry month (1-12), or null for a non-card method"
}
},
"additionalProperties": false
},
"description": "The saved payment methods, the default first (flagged default: true), then active, then expired"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List and filter the influencers who applied to a campaign, by pipeline state. Use this to work through a large applicant pool: pass a vibe like 'food creators' to rank applicants by how well they match, or filter by niche, country, followers, engagement, median views, gender or name. Returns each applicant with their stats, proposed pricing, match scores and delivery progress. Reads any campaign by id; no brand needs to be selected. NOTE: these buckets cover the CASTING phase only. Once a campaign starts, accepted creators move on into the working phases and the accepted bucket goes empty — that does NOT mean the campaign has no creators. To list the creators once a campaign is running, use list-preparation (getting ready to post), list-campaign-content (actively posting), and list-reporting-submissions (finished their task / reporting) — the last is where a creator who has completed their posts is found.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bucket
Which pipeline state to list: open (pending, awaiting a decision), accepted, declined, cancelled, or renegotiations (accepted with a pending price counter-offer).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose applications to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
countries
Only applicants based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe: how strict the semantic match must be — a lower value is looser, a higher value stricter, so a higher value returns fewer but closer matches.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
engagementMax
Only influencers whose Instagram engagement rate is at most this, as a percentage (e.g. 3.5 means 3.5%).
Clear enough to supply this argument.
engagementMin
Only influencers whose Instagram engagement rate is at least this, as a percentage (e.g. 3.5 means 3.5%).
Clear enough to supply this argument.
followersMax
Only influencers with at most this many Instagram followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followersMin
Only influencers with at least this many Instagram followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
gender
Only influencers of this gender.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
interests
Only applicants in these niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back.
Clear enough to supply this argument.
limit
How many applications to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
maxCutoffValue
Only with vibe: the upper bound on match strictness — pair with cutoffValue (the lower bound) to keep only applicants whose match falls within a band.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
medianViewsMax
Only influencers with at most this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
medianViewsMin
Only influencers with at least this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
How to sort (ignored when vibe is set, which sorts by match): recommendation (best-matched first), recent (newest first), or median_views (most-viewed first). Only applies to open, accepted and declined.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pool
Which applicant pool to list — the platform keeps pro and regular applicants in separate pools: all (both merged), pro (influencers who set their own price), or regular. Only applies to open, accepted and declined.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter by influencer name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank applicants by how well they match this free-text description, e.g. 'food creators' or 'minimalist home decor'. Uses semantic search — the best way to find the right creators in a large applicant pool.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applications",
"bucket",
"campaignId",
"count",
"hasMore",
"unmatchedInterests",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's applications page in the Refluenced web app"
},
"count": {
"type": "number",
"description": "How many applications match in this bucket in total, across all pages"
},
"bucket": {
"type": "string",
"description": "The pipeline state that was listed"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign these applications belong to"
},
"applications": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignId",
"caption",
"created",
"hoursPending",
"id",
"influencer",
"invited",
"message",
"pricing",
"productSent",
"progress",
"renegotiation",
"scores",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The application's id, used to move it through the pipeline"
},
"scores": {
"type": "object",
"required": [
"aesthetic",
"age",
"country",
"gender",
"performance",
"picture",
"recommendation",
"vibe"
],
"properties": {
"age": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience age match subscore (0-1), or null when not ranked"
},
"vibe": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Vibe (semantic search) match subscore (0-1), set when filtering by vibe"
},
"gender": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience gender match subscore (0-1), or null when not ranked"
},
"country": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience country match subscore (0-1), or null when not ranked"
},
"picture": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Profile picture subscore (0-1), or null when not ranked"
},
"aesthetic": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Aesthetic match subscore (0-1), or null when not ranked"
},
"performance": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Performance subscore (0-1), or null when not ranked"
},
"recommendation": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Overall recommendation score, or null when not ranked"
}
},
"description": "The platform's match subscores, used to rank a large applicant pool",
"additionalProperties": false
},
"status": {
"type": "string",
"description": "The application's pipeline state: pending, accepted, declined, cancelled, invited or rejected"
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The caption the influencer proposed for their content, or null"
},
"created": {
"type": "string",
"description": "When the influencer applied (ISO 8601)"
},
"invited": {
"type": "boolean",
"description": "Whether this application came from an invitation rather than an open apply"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The note the influencer sent with their application, or null"
},
"pricing": {
"type": "object",
"required": [
"contentUnitPrice",
"estimatedPrice",
"price"
],
"properties": {
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The pro influencer's proposed price in the campaign's currency, or null for a regular applicant"
},
"estimatedPrice": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The estimated total the brand pays this influencer, pre-formatted with its currency, or null"
},
"contentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The pro influencer's proposed buyout price per content, in the campaign's currency, or null"
}
},
"description": "What accepting this influencer would cost",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"postsDone",
"reelsDone",
"storiesDone",
"tiktokMediasDone",
"ugcDone"
],
"properties": {
"ugcDone": {
"type": "number",
"description": "UGC videos the influencer has delivered"
},
"postsDone": {
"type": "number",
"description": "Feed posts the influencer has delivered"
},
"reelsDone": {
"type": "number",
"description": "Reels the influencer has delivered"
},
"storiesDone": {
"type": "number",
"description": "Stories the influencer has delivered"
},
"tiktokMediasDone": {
"type": "number",
"description": "TikTok videos the influencer has delivered"
}
},
"description": "How much of the deliverable the influencer has completed",
"additionalProperties": false
},
"campaignId": {
"type": "number",
"description": "The id of the campaign this application belongs to"
},
"influencer": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"medianViews",
"name",
"numberOfOrders",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"userId",
"username",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id (InfluencerProfile.uuid), used by get-influencer"
},
"rating": {
"type": "number",
"description": "Overall rating (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser.id), used to message them (send-message) or invite them"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"qualityRating": {
"type": "number",
"description": "Average quality rating (0 when unrated)"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"description": "Who applied",
"additionalProperties": false
},
"productSent": {
"type": "boolean",
"description": "Whether the brand has marked the product as sent to this influencer"
},
"hoursPending": {
"type": "number",
"description": "Hours the application has waited — since applying, or since acceptance once accepted"
},
"renegotiation": {
"anyOf": [
{
"type": "object",
"required": [
"contentUnitPrice",
"message",
"oldContentUnitPrice",
"oldPrice",
"price",
"status"
],
"properties": {
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The price the brand counter-offered, in the campaign's currency, or null"
},
"status": {
"type": "string",
"description": "The counter-offer's state: PENDING, ACCEPTED or DECLINED"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The message that accompanied the counter-offer, or null"
},
"oldPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The influencer's original proposed price, in the campaign's currency, or null"
},
"contentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The buyout price per content the brand counter-offered, in the campaign's currency, or null"
},
"oldContentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The influencer's original buyout price per content, in the campaign's currency, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's one-time price counter-offer to this pro applicant, or null when none was sent"
}
},
"additionalProperties": false
},
"description": "The applications on this page, in the requested order"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-applications",
"title": "List a campaign's applications",
"description": "List and filter the influencers who applied to a campaign, by pipeline state. Use this to work through a large applicant pool: pass a vibe like 'food creators' to rank applicants by how well they match, or filter by niche, country, followers, engagement, median views, gender or name. Returns each applicant with their stats, proposed pricing, match scores and delivery progress. Reads any campaign by id; no brand needs to be selected. NOTE: these buckets cover the CASTING phase only. Once a campaign starts, accepted creators move on into the working phases and the accepted bucket goes empty — that does NOT mean the campaign has no creators. To list the creators once a campaign is running, use list-preparation (getting ready to post), list-campaign-content (actively posting), and list-reporting-submissions (finished their task / reporting) — the last is where a creator who has completed their posts is found.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"pool": {
"enum": [
"all",
"pro",
"regular"
],
"type": "string",
"default": "all",
"description": "Which applicant pool to list — the platform keeps pro and regular applicants in separate pools: all (both merged), pro (influencers who set their own price), or regular. Only applies to open, accepted and declined."
},
"vibe": {
"type": "string",
"description": "Rank applicants by how well they match this free-text description, e.g. 'food creators' or 'minimalist home decor'. Uses semantic search — the best way to find the right creators in a large applicant pool."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many applications to return per page."
},
"bucket": {
"enum": [
"accepted",
"cancelled",
"declined",
"open",
"renegotiations"
],
"type": "string",
"default": "open",
"description": "Which pipeline state to list: open (pending, awaiting a decision), accepted, declined, cancelled, or renegotiations (accepted with a pending price counter-offer)."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only influencers of this gender."
},
"search": {
"type": "string",
"description": "Filter by influencer name, Instagram handle or TikTok handle."
},
"ordering": {
"enum": [
"median_views",
"recent",
"recommendation"
],
"type": "string",
"default": "recommendation",
"description": "How to sort (ignored when vibe is set, which sorts by match): recommendation (best-matched first), recent (newest first), or median_views (most-viewed first). Only applies to open, accepted and declined."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only applicants based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only applicants in these niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose applications to list."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the semantic match must be — a lower value is looser, a higher value stricter, so a higher value returns fewer but closer matches."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at most this many Instagram followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at least this many Instagram followers."
},
"engagementMax": {
"type": "number",
"description": "Only influencers whose Instagram engagement rate is at most this, as a percentage (e.g. 3.5 means 3.5%)."
},
"engagementMin": {
"type": "number",
"description": "Only influencers whose Instagram engagement rate is at least this, as a percentage (e.g. 3.5 means 3.5%)."
},
"maxCutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: the upper bound on match strictness — pair with cutoffValue (the lower bound) to keep only applicants whose match falls within a band."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at least this many median views."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applications",
"bucket",
"campaignId",
"count",
"hasMore",
"unmatchedInterests",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's applications page in the Refluenced web app"
},
"count": {
"type": "number",
"description": "How many applications match in this bucket in total, across all pages"
},
"bucket": {
"type": "string",
"description": "The pipeline state that was listed"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign these applications belong to"
},
"applications": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignId",
"caption",
"created",
"hoursPending",
"id",
"influencer",
"invited",
"message",
"pricing",
"productSent",
"progress",
"renegotiation",
"scores",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The application's id, used to move it through the pipeline"
},
"scores": {
"type": "object",
"required": [
"aesthetic",
"age",
"country",
"gender",
"performance",
"picture",
"recommendation",
"vibe"
],
"properties": {
"age": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience age match subscore (0-1), or null when not ranked"
},
"vibe": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Vibe (semantic search) match subscore (0-1), set when filtering by vibe"
},
"gender": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience gender match subscore (0-1), or null when not ranked"
},
"country": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Audience country match subscore (0-1), or null when not ranked"
},
"picture": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Profile picture subscore (0-1), or null when not ranked"
},
"aesthetic": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Aesthetic match subscore (0-1), or null when not ranked"
},
"performance": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Performance subscore (0-1), or null when not ranked"
},
"recommendation": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Overall recommendation score, or null when not ranked"
}
},
"description": "The platform's match subscores, used to rank a large applicant pool",
"additionalProperties": false
},
"status": {
"type": "string",
"description": "The application's pipeline state: pending, accepted, declined, cancelled, invited or rejected"
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The caption the influencer proposed for their content, or null"
},
"created": {
"type": "string",
"description": "When the influencer applied (ISO 8601)"
},
"invited": {
"type": "boolean",
"description": "Whether this application came from an invitation rather than an open apply"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The note the influencer sent with their application, or null"
},
"pricing": {
"type": "object",
"required": [
"contentUnitPrice",
"estimatedPrice",
"price"
],
"properties": {
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The pro influencer's proposed price in the campaign's currency, or null for a regular applicant"
},
"estimatedPrice": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The estimated total the brand pays this influencer, pre-formatted with its currency, or null"
},
"contentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The pro influencer's proposed buyout price per content, in the campaign's currency, or null"
}
},
"description": "What accepting this influencer would cost",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"postsDone",
"reelsDone",
"storiesDone",
"tiktokMediasDone",
"ugcDone"
],
"properties": {
"ugcDone": {
"type": "number",
"description": "UGC videos the influencer has delivered"
},
"postsDone": {
"type": "number",
"description": "Feed posts the influencer has delivered"
},
"reelsDone": {
"type": "number",
"description": "Reels the influencer has delivered"
},
"storiesDone": {
"type": "number",
"description": "Stories the influencer has delivered"
},
"tiktokMediasDone": {
"type": "number",
"description": "TikTok videos the influencer has delivered"
}
},
"description": "How much of the deliverable the influencer has completed",
"additionalProperties": false
},
"campaignId": {
"type": "number",
"description": "The id of the campaign this application belongs to"
},
"influencer": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"medianViews",
"name",
"numberOfOrders",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"userId",
"username",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id (InfluencerProfile.uuid), used by get-influencer"
},
"rating": {
"type": "number",
"description": "Overall rating (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser.id), used to message them (send-message) or invite them"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"qualityRating": {
"type": "number",
"description": "Average quality rating (0 when unrated)"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"description": "Who applied",
"additionalProperties": false
},
"productSent": {
"type": "boolean",
"description": "Whether the brand has marked the product as sent to this influencer"
},
"hoursPending": {
"type": "number",
"description": "Hours the application has waited — since applying, or since acceptance once accepted"
},
"renegotiation": {
"anyOf": [
{
"type": "object",
"required": [
"contentUnitPrice",
"message",
"oldContentUnitPrice",
"oldPrice",
"price",
"status"
],
"properties": {
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The price the brand counter-offered, in the campaign's currency, or null"
},
"status": {
"type": "string",
"description": "The counter-offer's state: PENDING, ACCEPTED or DECLINED"
},
"message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The message that accompanied the counter-offer, or null"
},
"oldPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The influencer's original proposed price, in the campaign's currency, or null"
},
"contentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The buyout price per content the brand counter-offered, in the campaign's currency, or null"
},
"oldContentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The influencer's original buyout price per content, in the campaign's currency, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's one-time price counter-offer to this pro applicant, or null when none was sent"
}
},
"additionalProperties": false
},
"description": "The applications on this page, in the requested order"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List brand ambassadors across every brand — the admin hub's ambassadors view. An ambassador is a creator referred to a brand by a referral code. Filter by status, brand (companyId), verification, referral-code type, and free-text search; order by latest, signup, or review. Returns each ambassador with the creator (and their influencer id and user id, for get-influencer and the account/punishment tools), the brand, status, code type, verification, and dates, plus status counts across the whole set. For the richer aggregate statistics and top brands, use get-ambassador-stats. Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
codeType
Filter to ambassadors referred by a private or a public code. Omit for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
Scope to one brand by its company id (from list-brands). Omit to list ambassadors across all brands.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
Sort order: latest (most recent referral), signed_up (newest creator signup), or reviewed. Defaults to latest.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (20 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text filter over the creator's name or handle and the brand name.
Clear enough to supply this argument.
status
Filter by ambassadorship status. Omit for all; the returned stats always cover all statuses.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
verified
Filter to verified (true) or unverified (false) creators. Omit for both; the list defaults to all.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadors",
"companyId",
"count",
"hasMore",
"page",
"stats",
"status"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many ambassadors match in total, across all pages"
},
"stats": {
"type": "object",
"required": [
"accepted",
"implicit",
"pending",
"rejected",
"total"
],
"properties": {
"total": {
"type": "number",
"description": "How many ambassadorships there are in total"
},
"pending": {
"type": "number",
"description": "How many ambassadorships are pending"
},
"accepted": {
"type": "number",
"description": "How many ambassadorships are accepted"
},
"implicit": {
"type": "number",
"description": "How many ambassadorships are implicit"
},
"rejected": {
"type": "number",
"description": "How many ambassadorships are rejected"
}
},
"description": "Counts by status across the whole filtered set, ignoring the status filter",
"additionalProperties": false
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand the list was scoped to, or null when across all brands"
},
"ambassadors": {
"type": "array",
"items": {
"type": "object",
"required": [
"acceptedOn",
"brand",
"id",
"influencer",
"isVerified",
"referralCodeType",
"reviewedOn",
"signedUpOn",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The referral's id"
},
"brand": {
"type": "object",
"required": [
"companyName",
"id",
"slug"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's company id"
},
"slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's slug, or null when unset"
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when unset"
}
},
"description": "The brand the creator is an ambassador of",
"additionalProperties": false
},
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "Where the brand↔creator ambassadorship currently stands in the brand's review"
},
"acceptedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was accepted (ISO 8601), or null"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"engagement",
"followers",
"instagramUsername",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokUsername",
"userId",
"uuid"
],
"properties": {
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the punishment and account tools"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator behind the referral, or null when they have no influencer profile"
},
"isVerified": {
"type": "boolean",
"description": "Whether the referred creator has passed platform verification"
},
"reviewedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was reviewed (ISO 8601), or null"
},
"signedUpOn": {
"type": "string",
"description": "When the referred creator signed up (ISO 8601)"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
}
},
"additionalProperties": false
},
"description": "The ambassadors on this page, in the requested order"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-brand-ambassadors",
"title": "List brand ambassadors",
"description": "List brand ambassadors across every brand — the admin hub's ambassadors view. An ambassador is a creator referred to a brand by a referral code. Filter by status, brand (companyId), verification, referral-code type, and free-text search; order by latest, signup, or review. Returns each ambassador with the creator (and their influencer id and user id, for get-influencer and the account/punishment tools), the brand, status, code type, verification, and dates, plus status counts across the whole set. For the richer aggregate statistics and top brands, use get-ambassador-stats. Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return (20 per page)."
},
"search": {
"type": "string",
"description": "Free-text filter over the creator's name or handle and the brand name."
},
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "Filter by ambassadorship status. Omit for all; the returned stats always cover all statuses."
},
"codeType": {
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string",
"description": "Filter to ambassadors referred by a private or a public code. Omit for both."
},
"ordering": {
"enum": [
"latest",
"reviewed",
"signed_up"
],
"type": "string",
"description": "Sort order: latest (most recent referral), signed_up (newest creator signup), or reviewed. Defaults to latest."
},
"verified": {
"type": "boolean",
"description": "Filter to verified (true) or unverified (false) creators. Omit for both; the list defaults to all."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Scope to one brand by its company id (from list-brands). Omit to list ambassadors across all brands."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadors",
"companyId",
"count",
"hasMore",
"page",
"stats",
"status"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many ambassadors match in total, across all pages"
},
"stats": {
"type": "object",
"required": [
"accepted",
"implicit",
"pending",
"rejected",
"total"
],
"properties": {
"total": {
"type": "number",
"description": "How many ambassadorships there are in total"
},
"pending": {
"type": "number",
"description": "How many ambassadorships are pending"
},
"accepted": {
"type": "number",
"description": "How many ambassadorships are accepted"
},
"implicit": {
"type": "number",
"description": "How many ambassadorships are implicit"
},
"rejected": {
"type": "number",
"description": "How many ambassadorships are rejected"
}
},
"description": "Counts by status across the whole filtered set, ignoring the status filter",
"additionalProperties": false
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand the list was scoped to, or null when across all brands"
},
"ambassadors": {
"type": "array",
"items": {
"type": "object",
"required": [
"acceptedOn",
"brand",
"id",
"influencer",
"isVerified",
"referralCodeType",
"reviewedOn",
"signedUpOn",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The referral's id"
},
"brand": {
"type": "object",
"required": [
"companyName",
"id",
"slug"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's company id"
},
"slug": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's slug, or null when unset"
},
"companyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when unset"
}
},
"description": "The brand the creator is an ambassador of",
"additionalProperties": false
},
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "Where the brand↔creator ambassadorship currently stands in the brand's review"
},
"acceptedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was accepted (ISO 8601), or null"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"engagement",
"followers",
"instagramUsername",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokUsername",
"userId",
"uuid"
],
"properties": {
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the punishment and account tools"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator behind the referral, or null when they have no influencer profile"
},
"isVerified": {
"type": "boolean",
"description": "Whether the referred creator has passed platform verification"
},
"reviewedOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ambassadorship was reviewed (ISO 8601), or null"
},
"signedUpOn": {
"type": "string",
"description": "When the referred creator signed up (ISO 8601)"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
}
},
"additionalProperties": false
},
"description": "The ambassadors on this page, in the requested order"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List a brand's current members with their permission levels (view only, purchase only, full permissions, or owner) and every invitation on the brand, pending or resolved. A read — no scope needs to be selected. Only Refluenced administrators, or a member of the brand or its agency, may read this; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand whose members to read, from list-brands, get-brand, list-campaigns or search-campaigns.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"invites",
"members"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and none was read"
},
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"created",
"email",
"id",
"invitedBy",
"role",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The invitation's id"
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The permission level the invitee gets once they accept"
},
"email": {
"type": "string",
"description": "The invited email address"
},
"status": {
"type": "string",
"description": "The invitation's status: PENDING, ACCEPTED, or REJECTED"
},
"created": {
"type": "string",
"description": "When the invitation was created (ISO 8601)"
},
"invitedBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of whoever sent the invitation, or null"
}
},
"additionalProperties": false
},
"description": "Every invitation on the brand, of any status — filter on status PENDING for the outstanding ones"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"accessViaAgency",
"adminAccess",
"created",
"id",
"purchaseAccess",
"role",
"user",
"writeAccess"
],
"properties": {
"id": {
"type": "number",
"description": "The membership record's own id — not the member's user id; set-brand-member-role, remove-brand-member and remove-agency-member take the user id (user.id) instead."
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The member's effective permission level, collapsed from the access flags"
},
"user": {
"type": "object",
"required": [
"email",
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id — pass it to set-brand-member-role, remove-brand-member or remove-agency-member"
},
"email": {
"type": "string",
"description": "The member's email"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's last name, or null when not set"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's first name, or null when not set"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the member's profile picture, or null when none is set"
}
},
"description": "The member's user account",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the member was added (ISO 8601)"
},
"adminAccess": {
"type": "boolean",
"description": "Whether the member has admin access"
},
"writeAccess": {
"type": "boolean",
"description": "Whether the member has write access"
},
"purchaseAccess": {
"type": "boolean",
"description": "Whether the member has purchase access"
},
"accessViaAgency": {
"type": "boolean",
"description": "Whether the member's access comes from being an agency member rather than a direct brand member"
}
},
"additionalProperties": false
},
"description": "The brand's current members"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-brand-members",
"title": "List a brand's members",
"description": "List a brand's current members with their permission levels (view only, purchase only, full permissions, or owner) and every invitation on the brand, pending or resolved. A read — no scope needs to be selected. Only Refluenced administrators, or a member of the brand or its agency, may read this; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId"
],
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose members to read, from list-brands, get-brand, list-campaigns or search-campaigns."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"invites",
"members"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and none was read"
},
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"created",
"email",
"id",
"invitedBy",
"role",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The invitation's id"
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The permission level the invitee gets once they accept"
},
"email": {
"type": "string",
"description": "The invited email address"
},
"status": {
"type": "string",
"description": "The invitation's status: PENDING, ACCEPTED, or REJECTED"
},
"created": {
"type": "string",
"description": "When the invitation was created (ISO 8601)"
},
"invitedBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The user id of whoever sent the invitation, or null"
}
},
"additionalProperties": false
},
"description": "Every invitation on the brand, of any status — filter on status PENDING for the outstanding ones"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"accessViaAgency",
"adminAccess",
"created",
"id",
"purchaseAccess",
"role",
"user",
"writeAccess"
],
"properties": {
"id": {
"type": "number",
"description": "The membership record's own id — not the member's user id; set-brand-member-role, remove-brand-member and remove-agency-member take the user id (user.id) instead."
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The member's effective permission level, collapsed from the access flags"
},
"user": {
"type": "object",
"required": [
"email",
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id — pass it to set-brand-member-role, remove-brand-member or remove-agency-member"
},
"email": {
"type": "string",
"description": "The member's email"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's last name, or null when not set"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's first name, or null when not set"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "URL of the member's profile picture, or null when none is set"
}
},
"description": "The member's user account",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the member was added (ISO 8601)"
},
"adminAccess": {
"type": "boolean",
"description": "Whether the member has admin access"
},
"writeAccess": {
"type": "boolean",
"description": "Whether the member has write access"
},
"purchaseAccess": {
"type": "boolean",
"description": "Whether the member has purchase access"
},
"accessViaAgency": {
"type": "boolean",
"description": "Whether the member's access comes from being an agency member rather than a direct brand member"
}
},
"additionalProperties": false
},
"description": "The brand's current members"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Read the reviews and ratings creators have left a brand, with the brand's overall average rating — the profile's reviews tab. Each review carries the overall rating and its sub-scores (campaign prompts, reliability, future cooperation), the campaign it came from, and the reviewer. Present the ratings as a chart. Brand-scoped by id; resolve a brand name with list-brands first.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand whose reviews to read, from list-brands.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"count",
"hasMore",
"overallRating",
"reviews"
],
"properties": {
"count": {
"type": "number",
"description": "How many reviews there are in total, across all pages"
},
"brandId": {
"type": "number",
"description": "The brand the reviews are for"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaign",
"campaignPrompts",
"createdAt",
"futureCooperation",
"id",
"rating",
"reliability",
"reviewer"
],
"properties": {
"id": {
"type": "number",
"description": "The review's id"
},
"rating": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The overall rating this creator gave the brand, or null"
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "Campaign id"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The campaign the review came from, or null"
},
"reviewer": {
"anyOf": [
{
"type": "object",
"required": [
"firstName",
"pictureUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The reviewer's influencer profile id, or null"
},
"userId": {
"type": "number",
"description": "The reviewer's user id"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reviewer's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reviewer's profile picture, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator who left the review, or null"
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the review was left, or null"
},
"reliability": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The reliability sub-score, or null"
},
"campaignPrompts": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-prompts sub-score, or null"
},
"futureCooperation": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The future-cooperation sub-score, or null"
}
},
"additionalProperties": false
},
"description": "The reviews on this page, newest first"
},
"overallRating": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's overall average rating, or null when unrated"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-brand-reviews",
"title": "List a brand's reviews",
"description": "Read the reviews and ratings creators have left a brand, with the brand's overall average rating — the profile's reviews tab. Each review carries the overall rating and its sub-scores (campaign prompts, reliability, future cooperation), the campaign it came from, and the reviewer. Present the ratings as a chart. Brand-scoped by id; resolve a brand name with list-brands first.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many reviews to return per page."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose reviews to read, from list-brands."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"count",
"hasMore",
"overallRating",
"reviews"
],
"properties": {
"count": {
"type": "number",
"description": "How many reviews there are in total, across all pages"
},
"brandId": {
"type": "number",
"description": "The brand the reviews are for"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaign",
"campaignPrompts",
"createdAt",
"futureCooperation",
"id",
"rating",
"reliability",
"reviewer"
],
"properties": {
"id": {
"type": "number",
"description": "The review's id"
},
"rating": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The overall rating this creator gave the brand, or null"
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "Campaign id"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's brand"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The campaign the review came from, or null"
},
"reviewer": {
"anyOf": [
{
"type": "object",
"required": [
"firstName",
"pictureUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The reviewer's influencer profile id, or null"
},
"userId": {
"type": "number",
"description": "The reviewer's user id"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reviewer's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reviewer's profile picture, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The creator who left the review, or null"
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the review was left, or null"
},
"reliability": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The reliability sub-score, or null"
},
"campaignPrompts": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-prompts sub-score, or null"
},
"futureCooperation": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The future-cooperation sub-score, or null"
}
},
"additionalProperties": false
},
"description": "The reviews on this page, newest first"
},
"overallRating": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's overall average rating, or null when unrated"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List the brands you may work on behalf of. Search by brand name or a member's name or email, filter by subscription (plan status, how it was assigned, plan tier, and social channel access), and page through the results. Pass agencyId (from list-agencies) to list only that agency's sub-brands instead — the whole set at once, with search, page, and the subscription filters ignored. Use this to find a brand's id before selecting it with select-brand. Only Refluenced administrators may list brands; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
activeSubscription
Filter by the brand's plan status: true keeps only brands whose subscription is currently within its valid window, false only those whose subscription has lapsed.
Clear enough to supply this argument.
adminAssigned
Filter by how the brand's subscription was assigned: true keeps only staff-assigned (admin) subscriptions, false only self-purchased (Stripe) ones.
Clear enough to supply this argument.
agencyId
The id of an agency, from list-agencies. When set, lists only that agency's sub-brands — all of them at once, ignoring search, page, and the subscription filters.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
instagramPackage
When true, keep only brands whose plan grants Instagram campaigns.
Clear enough to supply this argument.
packageName
Filter to brands on this exact plan tier (ENTERPRISE is labelled 'Tailored' in the web app).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return. Each page holds up to 12 brands; request the next page while hasMore is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Narrow the list to brands whose name, or a member's name or email, matches this text.
Clear enough to supply this argument.
tiktokPackage
When true, keep only brands whose plan grants TikTok campaigns.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brands",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total brands matching the query across every page"
},
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyName",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id, passed to select-brand to work on behalf of it"
},
"name": {
"type": "string",
"description": "The brand's name"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is on file"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
}
},
"additionalProperties": false
},
"description": "The brands on this page of results"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-brands",
"title": "List brands",
"description": "List the brands you may work on behalf of. Search by brand name or a member's name or email, filter by subscription (plan status, how it was assigned, plan tier, and social channel access), and page through the results. Pass agencyId (from list-agencies) to list only that agency's sub-brands instead — the whole set at once, with search, page, and the subscription filters ignored. Use this to find a brand's id before selecting it with select-brand. Only Refluenced administrators may list brands; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return. Each page holds up to 12 brands; request the next page while hasMore is true."
},
"search": {
"type": "string",
"description": "Narrow the list to brands whose name, or a member's name or email, matches this text."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. When set, lists only that agency's sub-brands — all of them at once, ignoring search, page, and the subscription filters."
},
"packageName": {
"enum": [
"ADVANCED",
"ENTERPRISE",
"ESSENTIALS",
"EXPERT",
"PROFESSIONAL",
"STARTER"
],
"type": "string",
"description": "Filter to brands on this exact plan tier (ENTERPRISE is labelled 'Tailored' in the web app)."
},
"adminAssigned": {
"type": "boolean",
"description": "Filter by how the brand's subscription was assigned: true keeps only staff-assigned (admin) subscriptions, false only self-purchased (Stripe) ones."
},
"tiktokPackage": {
"type": "boolean",
"description": "When true, keep only brands whose plan grants TikTok campaigns."
},
"instagramPackage": {
"type": "boolean",
"description": "When true, keep only brands whose plan grants Instagram campaigns."
},
"activeSubscription": {
"type": "boolean",
"description": "Filter by the brand's plan status: true keeps only brands whose subscription is currently within its valid window, false only those whose subscription has lapsed."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brands",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total brands matching the query across every page"
},
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyName",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id, passed to select-brand to work on behalf of it"
},
"name": {
"type": "string",
"description": "The brand's name"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is on file"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
}
},
"additionalProperties": false
},
"description": "The brands on this page of results"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List the brand↔creator chat threads on one campaign — the inbox view, with each thread's brand-facing unread count, whether it needs a reply, any pending request (extension, cancellation, content approval), the last message, and the creator's delivery progress. Sort by most recent activity or by which need a reply first, and filter by the creator's name or handle. Each thread carries the ids (campaignId + the creator's userId) to open it with list-messages or reply with send-message. A read; no brand needs to be selected. For the cross-campaign 'who is waiting on us' queue across a whole brand, use list-chats-needing-reply.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose chat threads to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of threads to return (10 per page), starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text filter over the creator's first name or username.
Clear enough to supply this argument.
sort
Order threads by most recent activity, or by which need a brand reply first.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bulkRecipientCount",
"campaignId",
"chats",
"completedCount",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"chats": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"brandName",
"campaignId",
"campaignTitle",
"chatLink",
"hasCompleted",
"lastMessage",
"needsReply",
"pendingRequestType",
"progress",
"unreadByCompany",
"unreadByInfluencer",
"user"
],
"properties": {
"user": {
"type": "object",
"required": [
"firstName",
"id",
"influencerProfileUuid",
"pictureUrl",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The creator's user id (influencerUserId for list-messages/send-message)"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's username, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile picture, or null"
},
"influencerProfileUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null"
}
},
"description": "The creator the thread is with",
"additionalProperties": false
},
"chatLink": {
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the thread"
},
"campaignId": {
"type": "number",
"description": "The campaign id for the thread"
},
"influencerUserId": {
"type": "number",
"description": "The creator's user id for the thread"
}
},
"description": "The ids that address this brand↔creator thread for list-messages/send-message",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"posts",
"postsTarget",
"reels",
"reelsTarget",
"stories",
"storiesTarget",
"tiktokMedias",
"tiktokMediasTarget",
"ugc",
"ugcTarget"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC videos delivered"
},
"posts": {
"type": "number",
"description": "Feed posts delivered"
},
"reels": {
"type": "number",
"description": "Reels delivered"
},
"stories": {
"type": "number",
"description": "Stories delivered"
},
"ugcTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UGC videos the campaign asks for, or null"
},
"postsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Feed posts the campaign asks for, or null"
},
"reelsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Reels the campaign asks for, or null"
},
"tiktokMedias": {
"type": "number",
"description": "TikTok videos delivered"
},
"storiesTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stories the campaign asks for, or null"
},
"tiktokMediasTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos the campaign asks for, or null"
}
},
"description": "What the creator has delivered against what the campaign asks for",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand running the campaign, or null"
},
"campaignId": {
"type": "number",
"description": "The campaign's id (also the campaignId for list-messages/send-message)"
},
"needsReply": {
"type": "boolean",
"description": "Whether the brand owes a reply — an unread creator message, a pending request, or a pending submission"
},
"lastMessage": {
"anyOf": [
{
"type": "object",
"required": [
"createdAt",
"createdByAdmin",
"senderId",
"senderName",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The last message's text"
},
"senderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The last message sender's user id, or null"
},
"createdAt": {
"type": "string",
"description": "When the last message was sent"
},
"senderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The last message sender's name, or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the last message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The most recent message in the thread, or null when there is none"
},
"hasCompleted": {
"type": "boolean",
"description": "Whether the thread is closed/completed"
},
"applicationId": {
"type": "number",
"description": "The campaign application's id — the thread is this creator on this campaign"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null"
},
"unreadByCompany": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the brand has not read — the triage signal; null when unknown"
},
"pendingRequestType": {
"anyOf": [
{
"enum": [
"CANCELLATION",
"CONTENT_APPROVAL",
"EXTENSION"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The type of request awaiting the brand on this thread, or null when none is pending"
},
"unreadByInfluencer": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the creator has not read, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The chat threads on this page, in the requested order"
},
"count": {
"type": "number",
"description": "How many threads match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of threads exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign the threads belong to"
},
"completedCount": {
"type": "number",
"description": "How many of the listed threads are closed/completed"
},
"bulkRecipientCount": {
"type": "number",
"description": "How many creators a bulk message on this campaign would reach"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaign-chats",
"title": "List a campaign's chat threads",
"description": "List the brand↔creator chat threads on one campaign — the inbox view, with each thread's brand-facing unread count, whether it needs a reply, any pending request (extension, cancellation, content approval), the last message, and the creator's delivery progress. Sort by most recent activity or by which need a reply first, and filter by the creator's name or handle. Each thread carries the ids (campaignId + the creator's userId) to open it with list-messages or reply with send-message. A read; no brand needs to be selected. For the cross-campaign 'who is waiting on us' queue across a whole brand, use list-chats-needing-reply.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of threads to return (10 per page), starting at 1."
},
"sort": {
"enum": [
"most_recent",
"needs_reply"
],
"type": "string",
"default": "most_recent",
"description": "Order threads by most recent activity, or by which need a brand reply first."
},
"search": {
"type": "string",
"description": "Free-text filter over the creator's first name or username."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose chat threads to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"bulkRecipientCount",
"campaignId",
"chats",
"completedCount",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"chats": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"brandName",
"campaignId",
"campaignTitle",
"chatLink",
"hasCompleted",
"lastMessage",
"needsReply",
"pendingRequestType",
"progress",
"unreadByCompany",
"unreadByInfluencer",
"user"
],
"properties": {
"user": {
"type": "object",
"required": [
"firstName",
"id",
"influencerProfileUuid",
"pictureUrl",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The creator's user id (influencerUserId for list-messages/send-message)"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's username, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile picture, or null"
},
"influencerProfileUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null"
}
},
"description": "The creator the thread is with",
"additionalProperties": false
},
"chatLink": {
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the thread"
},
"campaignId": {
"type": "number",
"description": "The campaign id for the thread"
},
"influencerUserId": {
"type": "number",
"description": "The creator's user id for the thread"
}
},
"description": "The ids that address this brand↔creator thread for list-messages/send-message",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"posts",
"postsTarget",
"reels",
"reelsTarget",
"stories",
"storiesTarget",
"tiktokMedias",
"tiktokMediasTarget",
"ugc",
"ugcTarget"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC videos delivered"
},
"posts": {
"type": "number",
"description": "Feed posts delivered"
},
"reels": {
"type": "number",
"description": "Reels delivered"
},
"stories": {
"type": "number",
"description": "Stories delivered"
},
"ugcTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UGC videos the campaign asks for, or null"
},
"postsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Feed posts the campaign asks for, or null"
},
"reelsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Reels the campaign asks for, or null"
},
"tiktokMedias": {
"type": "number",
"description": "TikTok videos delivered"
},
"storiesTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stories the campaign asks for, or null"
},
"tiktokMediasTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos the campaign asks for, or null"
}
},
"description": "What the creator has delivered against what the campaign asks for",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand running the campaign, or null"
},
"campaignId": {
"type": "number",
"description": "The campaign's id (also the campaignId for list-messages/send-message)"
},
"needsReply": {
"type": "boolean",
"description": "Whether the brand owes a reply — an unread creator message, a pending request, or a pending submission"
},
"lastMessage": {
"anyOf": [
{
"type": "object",
"required": [
"createdAt",
"createdByAdmin",
"senderId",
"senderName",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The last message's text"
},
"senderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The last message sender's user id, or null"
},
"createdAt": {
"type": "string",
"description": "When the last message was sent"
},
"senderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The last message sender's name, or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the last message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The most recent message in the thread, or null when there is none"
},
"hasCompleted": {
"type": "boolean",
"description": "Whether the thread is closed/completed"
},
"applicationId": {
"type": "number",
"description": "The campaign application's id — the thread is this creator on this campaign"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null"
},
"unreadByCompany": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the brand has not read — the triage signal; null when unknown"
},
"pendingRequestType": {
"anyOf": [
{
"enum": [
"CANCELLATION",
"CONTENT_APPROVAL",
"EXTENSION"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The type of request awaiting the brand on this thread, or null when none is pending"
},
"unreadByInfluencer": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the creator has not read, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The chat threads on this page, in the requested order"
},
"count": {
"type": "number",
"description": "How many threads match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of threads exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign the threads belong to"
},
"completedCount": {
"type": "number",
"description": "How many of the listed threads are closed/completed"
},
"bulkRecipientCount": {
"type": "number",
"description": "How many creators a bulk message on this campaign would reach"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List the creators working on a running campaign with their delivery progress (posts, reels, stories, TikTok videos, UGC) and the review state of their content submissions (pending, approved, published, revision, rejected). The actual media is best viewed in the web app — the result includes a deep link to the campaign's active page. Use it to see who has delivered and whose content needs review (review-content-submission). Reads any campaign by id; no brand needs to be selected. NOTE: this lists only creators still ACTIVELY posting. A creator who has finished (completed their task) leaves this phase and is no longer listed here — find them, with their userId for messaging, in list-reporting-submissions. So an empty result here can just mean everyone has already finished, not that the campaign has no creators.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the running campaign whose creators and content to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many creators to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter by creator name, Instagram handle or TikTok handle.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applications",
"campaignId",
"count",
"hasMore",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's active page in the Refluenced web app, where the actual content can be viewed"
},
"count": {
"type": "number",
"description": "How many active creators there are in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign these creators belong to"
},
"applications": {
"type": "array",
"items": {
"type": "object",
"required": [
"contentUrl",
"id",
"influencer",
"manuallyCompleted",
"progress",
"submissions",
"taskCompleted",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The application's id"
},
"progress": {
"type": "object",
"required": [
"postsDone",
"reelsDone",
"storiesDone",
"tiktokMediasDone",
"ugcDone"
],
"properties": {
"ugcDone": {
"type": "number",
"description": "UGC videos delivered"
},
"postsDone": {
"type": "number",
"description": "Feed posts delivered"
},
"reelsDone": {
"type": "number",
"description": "Reels delivered"
},
"storiesDone": {
"type": "number",
"description": "Stories delivered"
},
"tiktokMediasDone": {
"type": "number",
"description": "TikTok videos delivered"
}
},
"description": "How much of the deliverable the creator has produced",
"additionalProperties": false
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
},
"contentUrl": {
"type": "string",
"description": "A deep link to this creator's content on the campaign's active page, pre-filtered to their name"
},
"influencer": {
"type": "string",
"description": "The creator's display name, falling back to their username"
},
"submissions": {
"type": "array",
"items": {
"type": "object",
"required": [
"aiRecommendation",
"id",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The submission's id, for get-content-submission or review-content-submission"
},
"status": {
"type": "string",
"description": "The submission's state: PENDING, APPROVED, PUBLISHED, REVISION_REQUESTED or REJECTED"
},
"aiRecommendation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI's recommendation for this submission (APPROVE or REQUEST_REVISION), or null when not evaluated"
}
},
"additionalProperties": false
},
"description": "The creator's content submissions, each with its review state and the AI's recommendation"
},
"taskCompleted": {
"type": "boolean",
"description": "Whether the creator's task counts as complete (delivered or manually marked)"
},
"manuallyCompleted": {
"type": "boolean",
"description": "Whether an admin manually marked this creator's task as complete"
}
},
"additionalProperties": false
},
"description": "The active creators, with their delivery progress and submission states"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaign-content",
"title": "List a running campaign's creators and content",
"description": "List the creators working on a running campaign with their delivery progress (posts, reels, stories, TikTok videos, UGC) and the review state of their content submissions (pending, approved, published, revision, rejected). The actual media is best viewed in the web app — the result includes a deep link to the campaign's active page. Use it to see who has delivered and whose content needs review (review-content-submission). Reads any campaign by id; no brand needs to be selected. NOTE: this lists only creators still ACTIVELY posting. A creator who has finished (completed their task) leaves this phase and is no longer listed here — find them, with their userId for messaging, in list-reporting-submissions. So an empty result here can just mean everyone has already finished, not that the campaign has no creators.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"limit": {
"type": "integer",
"default": 8,
"maximum": 8,
"minimum": 1,
"description": "How many creators to return per page."
},
"search": {
"type": "string",
"description": "Filter by creator name, Instagram handle or TikTok handle."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the running campaign whose creators and content to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applications",
"campaignId",
"count",
"hasMore",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's active page in the Refluenced web app, where the actual content can be viewed"
},
"count": {
"type": "number",
"description": "How many active creators there are in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign these creators belong to"
},
"applications": {
"type": "array",
"items": {
"type": "object",
"required": [
"contentUrl",
"id",
"influencer",
"manuallyCompleted",
"progress",
"submissions",
"taskCompleted",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The application's id"
},
"progress": {
"type": "object",
"required": [
"postsDone",
"reelsDone",
"storiesDone",
"tiktokMediasDone",
"ugcDone"
],
"properties": {
"ugcDone": {
"type": "number",
"description": "UGC videos delivered"
},
"postsDone": {
"type": "number",
"description": "Feed posts delivered"
},
"reelsDone": {
"type": "number",
"description": "Reels delivered"
},
"storiesDone": {
"type": "number",
"description": "Stories delivered"
},
"tiktokMediasDone": {
"type": "number",
"description": "TikTok videos delivered"
}
},
"description": "How much of the deliverable the creator has produced",
"additionalProperties": false
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
},
"contentUrl": {
"type": "string",
"description": "A deep link to this creator's content on the campaign's active page, pre-filtered to their name"
},
"influencer": {
"type": "string",
"description": "The creator's display name, falling back to their username"
},
"submissions": {
"type": "array",
"items": {
"type": "object",
"required": [
"aiRecommendation",
"id",
"status"
],
"properties": {
"id": {
"type": "number",
"description": "The submission's id, for get-content-submission or review-content-submission"
},
"status": {
"type": "string",
"description": "The submission's state: PENDING, APPROVED, PUBLISHED, REVISION_REQUESTED or REJECTED"
},
"aiRecommendation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The AI's recommendation for this submission (APPROVE or REQUEST_REVISION), or null when not evaluated"
}
},
"additionalProperties": false
},
"description": "The creator's content submissions, each with its review state and the AI's recommendation"
},
"taskCompleted": {
"type": "boolean",
"description": "Whether the creator's task counts as complete (delivered or manually marked)"
},
"manuallyCompleted": {
"type": "boolean",
"description": "Whether an admin manually marked this creator's task as complete"
}
},
"additionalProperties": false
},
"description": "The active creators, with their delivery progress and submission states"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
List the creators invited to a campaign by status — pending (invited, not yet responded) or rejected (declined the invitation). Distinct from list-applications (creators who applied) and list-invitable-creators (creators the campaign could invite). Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose invitations to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many creators to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Which invitations to list: pending (invited, awaiting a response) or rejected (declined by the creator).
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List the influencer groups attached to a campaign — the invite plan for a draft campaign, resolved into real invitations when it is published. Each entry names the group, whether the whole group or a chosen subset will be invited, and the members eligible for this campaign (verified on its platform and in one of its locations). Groups with no eligible members for the campaign are omitted, exactly as the web app hides them. Attach a group to a draft with invite-group-to-draft-campaign; for a live campaign use invite-group-to-campaign.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose attached groups to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"invites"
],
"properties": {
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignId",
"group",
"groupType",
"id",
"influencers"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign group-invite id"
},
"group": {
"type": "object",
"required": [
"autoUpdate",
"created",
"id",
"inviteVerifiedInfluencersCount",
"memberCount",
"members",
"name",
"pendingCount",
"smart",
"verifiedInfluencersCount"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "A preview of the group's members (up to 4 for smart groups, all for custom groups)"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"memberCount": {
"type": "number",
"description": "How many creators are in the group"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Pending ambassadorships — only non-null on the 'brand ambassador' smart group, null otherwise"
},
"verifiedInfluencersCount": {
"type": "number",
"description": "Members eligible for the campaign — 0 unless a campaignId gives campaign context"
},
"inviteVerifiedInfluencersCount": {
"type": "number",
"description": "Campaign-eligible members excluding those who joined in the last 30 days — 0 unless a campaignId gives campaign context"
}
},
"description": "The attached group, with its member preview and counts",
"additionalProperties": false
},
"groupType": {
"enum": [
"AGENCY",
"BRAND"
],
"type": "string",
"description": "Whether the attached group is a brand's or an agency's"
},
"campaignId": {
"type": "number",
"description": "The campaign the group is attached to"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "The specific campaign-eligible members that will be invited; empty means the whole group is invited. Only members eligible for the campaign are listed."
}
},
"additionalProperties": false
},
"description": "The groups attached to the campaign, each with the campaign-eligible members it will invite"
},
"campaignId": {
"type": "number",
"description": "The campaign the groups are attached to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaign-invited-groups",
"title": "List the groups attached to a campaign",
"description": "List the influencer groups attached to a campaign — the invite plan for a draft campaign, resolved into real invitations when it is published. Each entry names the group, whether the whole group or a chosen subset will be invited, and the members eligible for this campaign (verified on its platform and in one of its locations). Groups with no eligible members for the campaign are omitted, exactly as the web app hides them. Attach a group to a draft with invite-group-to-draft-campaign; for a live campaign use invite-group-to-campaign.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose attached groups to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"invites"
],
"properties": {
"invites": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignId",
"group",
"groupType",
"id",
"influencers"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign group-invite id"
},
"group": {
"type": "object",
"required": [
"autoUpdate",
"created",
"id",
"inviteVerifiedInfluencersCount",
"memberCount",
"members",
"name",
"pendingCount",
"smart",
"verifiedInfluencersCount"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "A preview of the group's members (up to 4 for smart groups, all for custom groups)"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"memberCount": {
"type": "number",
"description": "How many creators are in the group"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Pending ambassadorships — only non-null on the 'brand ambassador' smart group, null otherwise"
},
"verifiedInfluencersCount": {
"type": "number",
"description": "Members eligible for the campaign — 0 unless a campaignId gives campaign context"
},
"inviteVerifiedInfluencersCount": {
"type": "number",
"description": "Campaign-eligible members excluding those who joined in the last 30 days — 0 unless a campaignId gives campaign context"
}
},
"description": "The attached group, with its member preview and counts",
"additionalProperties": false
},
"groupType": {
"enum": [
"AGENCY",
"BRAND"
],
"type": "string",
"description": "Whether the attached group is a brand's or an agency's"
},
"campaignId": {
"type": "number",
"description": "The campaign the group is attached to"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "The specific campaign-eligible members that will be invited; empty means the whole group is invited. Only members eligible for the campaign are listed."
}
},
"additionalProperties": false
},
"description": "The groups attached to the campaign, each with the campaign-eligible members it will invite"
},
"campaignId": {
"type": "number",
"description": "The campaign the groups are attached to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List the Instagram, TikTok and source media creators have posted for a campaign, ranked by engagement, each with an id, format (Story, Reel, Feed post, TikTok video or Source material) and a permalink to view it on Instagram or TikTok. Refer to each piece by its format, not generically as a 'post'. Use it to find the media to feature (feature-media) or like (like-media). UGC videos are listed separately with list-ugc-media. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose synced media to list.
Clear enough to supply this argument.
limit
How many media items to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"media"
],
"properties": {
"count": {
"type": "number",
"description": "How many media items there are in total, across all pages"
},
"media": {
"type": "array",
"items": {
"type": "object",
"required": [
"caption",
"featured",
"format",
"id",
"influencer",
"liked",
"permalink",
"type"
],
"properties": {
"id": {
"type": "number",
"description": "The media's id, used to feature or like it"
},
"type": {
"type": "string",
"description": "The media's channel: INSTAGRAM, TIKTOK or SOURCE (used with feature-media / like-media)"
},
"liked": {
"type": "boolean",
"description": "Whether the brand has liked this media"
},
"format": {
"type": "string",
"description": "The content format, for labelling the piece: 'Story', 'Reel', 'Feed post', 'TikTok video' or 'Source material'. Refer to it by this format, never generically as a 'post'."
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The media's caption, or null"
},
"featured": {
"type": "boolean",
"description": "Whether the brand has featured this media"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to view the piece on Instagram or TikTok, or null (e.g. source material has none)"
},
"influencer": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator who posted it, or null"
}
},
"additionalProperties": false
},
"description": "The synced Instagram, TikTok and source media, ranked by engagement"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign this media belongs to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaign-media",
"title": "List a campaign's synced media",
"description": "List the Instagram, TikTok and source media creators have posted for a campaign, ranked by engagement, each with an id, format (Story, Reel, Feed post, TikTok video or Source material) and a permalink to view it on Instagram or TikTok. Refer to each piece by its format, not generically as a 'post'. Use it to find the media to feature (feature-media) or like (like-media). UGC videos are listed separately with list-ugc-media. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many media items to return per page."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose synced media to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"media"
],
"properties": {
"count": {
"type": "number",
"description": "How many media items there are in total, across all pages"
},
"media": {
"type": "array",
"items": {
"type": "object",
"required": [
"caption",
"featured",
"format",
"id",
"influencer",
"liked",
"permalink",
"type"
],
"properties": {
"id": {
"type": "number",
"description": "The media's id, used to feature or like it"
},
"type": {
"type": "string",
"description": "The media's channel: INSTAGRAM, TIKTOK or SOURCE (used with feature-media / like-media)"
},
"liked": {
"type": "boolean",
"description": "Whether the brand has liked this media"
},
"format": {
"type": "string",
"description": "The content format, for labelling the piece: 'Story', 'Reel', 'Feed post', 'TikTok video' or 'Source material'. Refer to it by this format, never generically as a 'post'."
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The media's caption, or null"
},
"featured": {
"type": "boolean",
"description": "Whether the brand has featured this media"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to view the piece on Instagram or TikTok, or null (e.g. source material has none)"
},
"influencer": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator who posted it, or null"
}
},
"additionalProperties": false
},
"description": "The synced Instagram, TikTok and source media, ranked by engagement"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"campaignId": {
"type": "number",
"description": "The campaign this media belongs to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
List a campaign's extension and cancellation requests
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
List the extension and cancellation requests influencers (or the brand) have raised on a campaign, with each request's type, state and reason. Use it to see what is pending before responding with respond-to-campaign-request. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose extension and cancellation requests to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"requests"
],
"properties": {
"count": {
"type": "number",
"description": "How many requests match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"adminReason",
"applicationId",
"brandReason",
"cancellationReason",
"extensionDate",
"id",
"influencerReason",
"influencerReasonType",
"status",
"type"
],
"properties": {
"id": {
"type": "number",
"description": "The request's id, used to accept or decline it"
},
"type": {
"type": "string",
"description": "The request type: EXTENSION (influencer wants more time), CANCELLATION (influencer wants out) or BRAND_CANCELLATION (the brand asked to remove the influencer)."
},
"status": {
"type": "string",
"description": "The request's state: PENDING, ACCEPTED or DECLINED"
},
"adminReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "An admin's reason on a brand-cancellation decision, or null"
},
"brandReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's reason for declining the request, or null"
},
"applicationId": {
"type": "number",
"description": "The id of the application this request is about"
},
"extensionDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new completion date the influencer asked for, or null"
},
"influencerReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's free-text reason for the request, or null"
},
"cancellationReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's reason when the brand requested a cancellation, or null"
},
"influencerReasonType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's categorised reason, e.g. ILLNESS_OR_HEALTH_ISSUES, or null"
}
},
"additionalProperties": false
},
"description": "The extension and cancellation requests on this campaign"
},
"campaignId": {
"type": "number",
"description": "The campaign these requests belong to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaign-requests",
"title": "List a campaign's extension and cancellation requests",
"description": "List the extension and cancellation requests influencers (or the brand) have raised on a campaign, with each request's type, state and reason. Use it to see what is pending before responding with respond-to-campaign-request. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose extension and cancellation requests to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"requests"
],
"properties": {
"count": {
"type": "number",
"description": "How many requests match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"adminReason",
"applicationId",
"brandReason",
"cancellationReason",
"extensionDate",
"id",
"influencerReason",
"influencerReasonType",
"status",
"type"
],
"properties": {
"id": {
"type": "number",
"description": "The request's id, used to accept or decline it"
},
"type": {
"type": "string",
"description": "The request type: EXTENSION (influencer wants more time), CANCELLATION (influencer wants out) or BRAND_CANCELLATION (the brand asked to remove the influencer)."
},
"status": {
"type": "string",
"description": "The request's state: PENDING, ACCEPTED or DECLINED"
},
"adminReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "An admin's reason on a brand-cancellation decision, or null"
},
"brandReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's reason for declining the request, or null"
},
"applicationId": {
"type": "number",
"description": "The id of the application this request is about"
},
"extensionDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The new completion date the influencer asked for, or null"
},
"influencerReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's free-text reason for the request, or null"
},
"cancellationReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's reason when the brand requested a cancellation, or null"
},
"influencerReasonType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's categorised reason, e.g. ILLNESS_OR_HEALTH_ISSUES, or null"
}
},
"additionalProperties": false
},
"description": "The extension and cancellation requests on this campaign"
},
"campaignId": {
"type": "number",
"description": "The campaign these requests belong to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List campaigns in a given status for either a brand or an agency. Pass a brand (brandId + brandName, from list-brands) for that brand's own campaigns, or an agency (agencyId + agencyName, from list-agencies) for its sub-brands' campaigns combined — one scope, not both. Each campaign carries its application counts and performance so far. Without a scope it refuses rather than answering from your own data. Defaults to active; pass status to list open, planned, draft, complete or paused instead. These buckets are the same groupings the platform dashboard shows under each tab, and the list is complete as returned — present it as-is.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Provide a brand or an agency, not both — with an agency the list spans every sub-brand's campaigns.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, used to state the scope back to the user.
Clear enough to supply this argument.
brandId
The id of a brand to list campaigns for, from list-brands. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands, used to state the scope back to the user.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
page
Which page of results to return; request the next page while hasMore is true.
Clear enough to supply this argument.
status
Which status bucket to list: active (currently running), open (accepting applications), planned (casting not started), draft (not yet published), complete (finished), or paused (ongoing campaign on hold). planned is brand-only — it is not available when listing an agency.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"count",
"hasMore",
"page",
"scope",
"status"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns in this status across every page"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency these campaigns belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the campaigns are a single brand's or a whole agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency these campaigns belong to"
}
},
"description": "The brand or agency the campaigns were listed for",
"additionalProperties": false
},
"status": {
"type": "string",
"description": "The status bucket that was listed"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationsCount",
"castingStart",
"completed",
"deadline",
"id",
"instagram",
"locations",
"stats",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"stats": {
"type": "object",
"required": [
"clicks",
"estimatedClicks",
"estimatedImpressions",
"impressions",
"reach"
],
"properties": {
"reach": {
"type": "number",
"description": "Measured reach across accepted influencers"
},
"clicks": {
"type": "number",
"description": "Measured clicks across accepted influencers"
},
"impressions": {
"type": "number",
"description": "Measured impressions across accepted influencers"
},
"estimatedClicks": {
"type": "number",
"description": "Estimated clicks where measured data is not in yet"
},
"estimatedImpressions": {
"type": "number",
"description": "Estimated impressions where measured data is not in yet"
}
},
"description": "Aggregate performance so far; zeros before any accepted influencer has reported",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's application deadline, or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete, or null when unset"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens, or null when unset"
},
"applicationsCount": {
"type": "object",
"required": [
"accepted",
"completed",
"total"
],
"properties": {
"total": {
"type": "number",
"description": "All applications to the campaign"
},
"accepted": {
"type": "number",
"description": "Applications accepted onto the campaign"
},
"completed": {
"type": "number",
"description": "Accepted applications that have completed their work"
}
},
"description": "How the campaign's applications break down by state",
"additionalProperties": false
}
},
"additionalProperties": false
},
"description": "The campaigns in the requested status"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-campaigns",
"title": "List a brand's or agency's campaigns",
"description": "List campaigns in a given status for either a brand or an agency. Pass a brand (brandId + brandName, from list-brands) for that brand's own campaigns, or an agency (agencyId + agencyName, from list-agencies) for its sub-brands' campaigns combined — one scope, not both. Each campaign carries its application counts and performance so far. Without a scope it refuses rather than answering from your own data. Defaults to active; pass status to list open, planned, draft, complete or paused instead. These buckets are the same groupings the platform dashboard shows under each tab, and the list is complete as returned — present it as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return; request the next page while hasMore is true."
},
"status": {
"enum": [
"active",
"complete",
"draft",
"open",
"paused",
"planned"
],
"type": "string",
"default": "active",
"description": "Which status bucket to list: active (currently running), open (accepting applications), planned (casting not started), draft (not yet published), complete (finished), or paused (ongoing campaign on hold). planned is brand-only — it is not available when listing an agency."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand to list campaigns for, from list-brands. Provide a brand or an agency, not both."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Provide a brand or an agency, not both — with an agency the list spans every sub-brand's campaigns."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, used to state the scope back to the user."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, used to state the scope back to the user."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"count",
"hasMore",
"page",
"scope",
"status"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns in this status across every page"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency these campaigns belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the campaigns are a single brand's or a whole agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency these campaigns belong to"
}
},
"description": "The brand or agency the campaigns were listed for",
"additionalProperties": false
},
"status": {
"type": "string",
"description": "The status bucket that was listed"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationsCount",
"castingStart",
"completed",
"deadline",
"id",
"instagram",
"locations",
"stats",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"stats": {
"type": "object",
"required": [
"clicks",
"estimatedClicks",
"estimatedImpressions",
"impressions",
"reach"
],
"properties": {
"reach": {
"type": "number",
"description": "Measured reach across accepted influencers"
},
"clicks": {
"type": "number",
"description": "Measured clicks across accepted influencers"
},
"impressions": {
"type": "number",
"description": "Measured impressions across accepted influencers"
},
"estimatedClicks": {
"type": "number",
"description": "Estimated clicks where measured data is not in yet"
},
"estimatedImpressions": {
"type": "number",
"description": "Estimated impressions where measured data is not in yet"
}
},
"description": "Aggregate performance so far; zeros before any accepted influencer has reported",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's application deadline, or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete, or null when unset"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens, or null when unset"
},
"applicationsCount": {
"type": "object",
"required": [
"accepted",
"completed",
"total"
],
"properties": {
"total": {
"type": "number",
"description": "All applications to the campaign"
},
"accepted": {
"type": "number",
"description": "Applications accepted onto the campaign"
},
"completed": {
"type": "number",
"description": "Accepted applications that have completed their work"
}
},
"description": "How the campaign's applications break down by state",
"additionalProperties": false
}
},
"additionalProperties": false
},
"description": "The campaigns in the requested status"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List every brand↔creator chat across all of one brand's campaigns that is waiting on the brand — an unread creator message, a pending request (extension, cancellation, content approval), or a pending content submission. This is the cross-campaign 'who is waiting on us' queue; for the threads of a single campaign use list-campaign-chats. Scope it by the brand's companyId (from list-brands — resolve the brand name to its id first, and disambiguate when more than one matches). Each thread carries the ids (campaignId + the creator's userId) to open it with list-messages or reply with send-message. A read.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of threads to return (10 per page), starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text filter over the creator's first name or username.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"chats",
"companyId",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"chats": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"brandName",
"campaignId",
"campaignTitle",
"chatLink",
"hasCompleted",
"lastMessage",
"needsReply",
"pendingRequestType",
"progress",
"unreadByCompany",
"unreadByInfluencer",
"user"
],
"properties": {
"user": {
"type": "object",
"required": [
"firstName",
"id",
"influencerProfileUuid",
"pictureUrl",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The creator's user id (influencerUserId for list-messages/send-message)"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's username, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile picture, or null"
},
"influencerProfileUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null"
}
},
"description": "The creator the thread is with",
"additionalProperties": false
},
"chatLink": {
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the thread"
},
"campaignId": {
"type": "number",
"description": "The campaign id for the thread"
},
"influencerUserId": {
"type": "number",
"description": "The creator's user id for the thread"
}
},
"description": "The ids that address this brand↔creator thread for list-messages/send-message",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"posts",
"postsTarget",
"reels",
"reelsTarget",
"stories",
"storiesTarget",
"tiktokMedias",
"tiktokMediasTarget",
"ugc",
"ugcTarget"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC videos delivered"
},
"posts": {
"type": "number",
"description": "Feed posts delivered"
},
"reels": {
"type": "number",
"description": "Reels delivered"
},
"stories": {
"type": "number",
"description": "Stories delivered"
},
"ugcTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UGC videos the campaign asks for, or null"
},
"postsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Feed posts the campaign asks for, or null"
},
"reelsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Reels the campaign asks for, or null"
},
"tiktokMedias": {
"type": "number",
"description": "TikTok videos delivered"
},
"storiesTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stories the campaign asks for, or null"
},
"tiktokMediasTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos the campaign asks for, or null"
}
},
"description": "What the creator has delivered against what the campaign asks for",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand running the campaign, or null"
},
"campaignId": {
"type": "number",
"description": "The campaign's id (also the campaignId for list-messages/send-message)"
},
"needsReply": {
"type": "boolean",
"description": "Whether the brand owes a reply — an unread creator message, a pending request, or a pending submission"
},
"lastMessage": {
"anyOf": [
{
"type": "object",
"required": [
"createdAt",
"createdByAdmin",
"senderId",
"senderName",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The last message's text"
},
"senderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The last message sender's user id, or null"
},
"createdAt": {
"type": "string",
"description": "When the last message was sent"
},
"senderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The last message sender's name, or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the last message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The most recent message in the thread, or null when there is none"
},
"hasCompleted": {
"type": "boolean",
"description": "Whether the thread is closed/completed"
},
"applicationId": {
"type": "number",
"description": "The campaign application's id — the thread is this creator on this campaign"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null"
},
"unreadByCompany": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the brand has not read — the triage signal; null when unknown"
},
"pendingRequestType": {
"anyOf": [
{
"enum": [
"CANCELLATION",
"CONTENT_APPROVAL",
"EXTENSION"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The type of request awaiting the brand on this thread, or null when none is pending"
},
"unreadByInfluencer": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the creator has not read, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The threads awaiting a brand reply on this page, newest activity first"
},
"count": {
"type": "number",
"description": "How many threads need a reply in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"companyId": {
"type": "number",
"description": "The brand the queue was scoped to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-chats-needing-reply",
"title": "List a brand's chats awaiting a reply",
"description": "List every brand↔creator chat across all of one brand's campaigns that is waiting on the brand — an unread creator message, a pending request (extension, cancellation, content approval), or a pending content submission. This is the cross-campaign 'who is waiting on us' queue; for the threads of a single campaign use list-campaign-chats. Scope it by the brand's companyId (from list-brands — resolve the brand name to its id first, and disambiguate when more than one matches). Each thread carries the ids (campaignId + the creator's userId) to open it with list-messages or reply with send-message. A read.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of threads to return (10 per page), starting at 1."
},
"search": {
"type": "string",
"description": "Free-text filter over the creator's first name or username."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"chats",
"companyId",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"chats": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"brandName",
"campaignId",
"campaignTitle",
"chatLink",
"hasCompleted",
"lastMessage",
"needsReply",
"pendingRequestType",
"progress",
"unreadByCompany",
"unreadByInfluencer",
"user"
],
"properties": {
"user": {
"type": "object",
"required": [
"firstName",
"id",
"influencerProfileUuid",
"pictureUrl",
"username"
],
"properties": {
"id": {
"type": "number",
"description": "The creator's user id (influencerUserId for list-messages/send-message)"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's username, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's first name, or null"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile picture, or null"
},
"influencerProfileUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null"
}
},
"description": "The creator the thread is with",
"additionalProperties": false
},
"chatLink": {
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the thread"
},
"campaignId": {
"type": "number",
"description": "The campaign id for the thread"
},
"influencerUserId": {
"type": "number",
"description": "The creator's user id for the thread"
}
},
"description": "The ids that address this brand↔creator thread for list-messages/send-message",
"additionalProperties": false
},
"progress": {
"type": "object",
"required": [
"posts",
"postsTarget",
"reels",
"reelsTarget",
"stories",
"storiesTarget",
"tiktokMedias",
"tiktokMediasTarget",
"ugc",
"ugcTarget"
],
"properties": {
"ugc": {
"type": "number",
"description": "UGC videos delivered"
},
"posts": {
"type": "number",
"description": "Feed posts delivered"
},
"reels": {
"type": "number",
"description": "Reels delivered"
},
"stories": {
"type": "number",
"description": "Stories delivered"
},
"ugcTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "UGC videos the campaign asks for, or null"
},
"postsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Feed posts the campaign asks for, or null"
},
"reelsTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Reels the campaign asks for, or null"
},
"tiktokMedias": {
"type": "number",
"description": "TikTok videos delivered"
},
"storiesTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Stories the campaign asks for, or null"
},
"tiktokMediasTarget": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos the campaign asks for, or null"
}
},
"description": "What the creator has delivered against what the campaign asks for",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand running the campaign, or null"
},
"campaignId": {
"type": "number",
"description": "The campaign's id (also the campaignId for list-messages/send-message)"
},
"needsReply": {
"type": "boolean",
"description": "Whether the brand owes a reply — an unread creator message, a pending request, or a pending submission"
},
"lastMessage": {
"anyOf": [
{
"type": "object",
"required": [
"createdAt",
"createdByAdmin",
"senderId",
"senderName",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "The last message's text"
},
"senderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The last message sender's user id, or null"
},
"createdAt": {
"type": "string",
"description": "When the last message was sent"
},
"senderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The last message sender's name, or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the last message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The most recent message in the thread, or null when there is none"
},
"hasCompleted": {
"type": "boolean",
"description": "Whether the thread is closed/completed"
},
"applicationId": {
"type": "number",
"description": "The campaign application's id — the thread is this creator on this campaign"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null"
},
"unreadByCompany": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the brand has not read — the triage signal; null when unknown"
},
"pendingRequestType": {
"anyOf": [
{
"enum": [
"CANCELLATION",
"CONTENT_APPROVAL",
"EXTENSION"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The type of request awaiting the brand on this thread, or null when none is pending"
},
"unreadByInfluencer": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many messages in this thread the creator has not read, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The threads awaiting a brand reply on this page, newest activity first"
},
"count": {
"type": "number",
"description": "How many threads need a reply in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"companyId": {
"type": "number",
"description": "The brand the queue was scoped to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the agency accounts on the customer success dashboard's overview, each with its subscription (plan, billing period, prices, renewal date, 3+12/converting/trial/admin-assigned flags), live engagement and spend over two windows (lifetime and the period since renewal — campaigns, views, spend, CPMs with a health band, application and acceptance rates, invites, ad codes), tenure, handling status, happiness score, and latest note. By default only accounts with a running subscription are shown; includeAll, expired, or renewalMonth widen that. Filter and sort with the parameters; resolve a name with search or list-agencies. For one account's sub-brands use list-customer-success-brands, for its full detail get-customer-success-agency, and for the churn view list-customer-success-churn. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cancellationPending
Filter to accounts with (or without) a pending cancellation
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
descending
Sort descending instead of ascending (applies to sortBy)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
expired
Include accounts whose subscription has already lapsed
Clear enough to supply this argument.
happinessMax
Only accounts with a happiness score at or below this (1-10)
Resolve the mismatch between this description and its schema constraints.
happinessMin
Only accounts with a happiness score at or above this (1-10)
Resolve the mismatch between this description and its schema constraints.
includeAll
Include every account, not only those with a running subscription (the default view)
Clear enough to supply this argument.
packageName
Filter by plan name (e.g. STARTER, ESSENTIALS, ADVANCED, PROFESSIONAL, EXPERT, ENTERPRISE)
Clear enough to supply this argument.
packageType
Filter by billing period (e.g. MONTHLY, QUARTERLY, HALF_YEARLY, YEARLY)
Clear enough to supply this argument.
page
Which page of results to return, starting at 1 (12 per page)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
renewalMonth
Accounts whose period ended in this calendar month (YYYY-MM); lifts the running-only default
Clear enough to supply this argument.
renewingWithinDays
Only accounts renewing within this many days from now
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text search over the agency name
Clear enough to supply this argument.
sortBy
Which column to sort by; omit for the platform's default relevance ordering
Clear enough to supply this argument.
status
Filter by handling status; NONE also matches accounts with no record yet
Clear enough to supply this argument.
threePlusTwelve
Filter to (or away from) accounts on a 3+12 contract
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
List an agency account's sub-brands as shown when an overview row is expanded, each with the same two metric windows as the agency (lifetime and the period since renewal), scoped to the brand's own campaigns — there is no total CPM per brand, since subscription fees are agency-level. Resolve an agency name with list-customer-success-agencies (search) or list-agencies first. For the churn view of the sub-brands use list-customer-success-churn-brands. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The agency's id, from list-customer-success-agencies or list-agencies
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1 (12 per page)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the agency accounts on the customer success dashboard's churn view — the early-warning matrix — each with its latest churn snapshot: the raised markers (last login/campaign, low applications, repeat applicants, extension requests, unstarted campaigns, ad codes, creator-quota and buyout usage, ratings and response gaps, cadence), the high/medium/low counts, the account's risk tier, and its cancellation/conversion state. Filter by risk tier, by specific markers, and by the subscription filters; sort by markers (most-severe first) or a column. Resolve a name with search or list-agencies. For the aggregate counts use get-customer-success-churn-summary, for one account's sub-brand churn list-customer-success-churn-brands, and for the subscription-and-metrics overview list-customer-success-agencies. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs77/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cancellationPending
Filter to accounts with (or without) a pending cancellation
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
descending
Sort descending instead of ascending (applies to sortBy)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
markers
Only accounts with at least one of these markers raised (OR across the list)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
packageName
Filter by plan name (e.g. STARTER, ESSENTIALS, ADVANCED, EXPERT)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
packageType
Filter by billing period (e.g. MONTHLY, QUARTERLY, HALF_YEARLY, YEARLY)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1 (12 per page)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
renewingWithinDays
Only accounts renewing within this many days from now
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
risk
Filter by risk tier: act_now (≥2 high markers), watch (1 high, or any medium), or fine (none)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text search over the agency name
Clear enough to supply this argument.
sortBy
Sort by markers (most-severe first), renewal_date, agency_name, or a specific marker key
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
threePlusTwelve
Filter to (or away from) accounts on a 3+12 contract
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
List an agency account's sub-brands as shown when a churn row is expanded, each with its latest brand-level churn snapshot (the same markers as the agency, minus the plan-level creator-quota and buyout markers, which are agency-only). Resolve an agency name with list-customer-success-churn (search) or list-agencies first. For the overview-metrics view of the sub-brands use list-customer-success-brands. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The agency's id, from list-customer-success-churn or list-agencies
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (12 per page)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Read the customer-success notes the success team keeps against an agency account, newest first, each with its author and timestamp. Resolve an agency name with list-customer-success-agencies (search) or list-agencies first. To add one, use add-customer-success-note. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The agency's id, from list-customer-success-agencies or list-agencies
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List the soft-deleted campaigns across the platform — the recovery inbox, the safety net paired with delete-campaign. Each carries its id, to restore with recover-campaign. Admin-only and global: no brand is selected, and the platform refuses a non-admin, surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the pieces a brand has featured on a campaign — the curated highlight reel on the reporting tab. Returns each featured Instagram/TikTok/UGC piece with its creator, a preview link, and (for spark/partnership campaigns) its ad code and boost status. Pass an optional `date` (YYYY-MM-DD) to focus on one reporting period. Toggle what's featured with feature-media. Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose featured content to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date
Reporting period as YYYY-MM-DD (from get-campaign-reporting's availableDates) to focus on; omit to list the featured pieces across all periods.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"items",
"platform",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's reporting page in the Refluenced web app"
},
"count": {
"type": "number",
"description": "How many featured pieces there are"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"creatorName",
"creatorUserId",
"format",
"lastCopiedAt",
"mediaId",
"mediaUrl",
"permalink",
"platform",
"profileUrl",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the piece's ad code has been boosted (always false for UGC)"
},
"format": {
"type": "string",
"description": "The media format: POST, REEL, STORY, TIKTOK or UGC"
},
"mediaId": {
"type": "number",
"description": "The media's id — pass to feature-media, boost-content or set-ad-code"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A thumbnail/preview of the piece, or null"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram, tiktok or ugc"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null (UGC has none)"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code on the piece, or null"
},
"profileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile in the Refluenced web app, or null"
},
"creatorName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's display name, or null"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ad code was last boosted, or null (and null for UGC)"
},
"creatorUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id, or null"
}
},
"additionalProperties": false
},
"description": "The featured pieces, curated highlights the brand marked"
},
"platform": {
"type": "string",
"description": "The campaign's platform: instagram, tiktok or ugc"
},
"campaignId": {
"type": "number",
"description": "The campaign the featured content belongs to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-featured-content",
"title": "List a campaign's featured content",
"description": "List the pieces a brand has featured on a campaign — the curated highlight reel on the reporting tab. Returns each featured Instagram/TikTok/UGC piece with its creator, a preview link, and (for spark/partnership campaigns) its ad code and boost status. Pass an optional `date` (YYYY-MM-DD) to focus on one reporting period. Toggle what's featured with feature-media. Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"date": {
"type": "string",
"description": "Reporting period as YYYY-MM-DD (from get-campaign-reporting's availableDates) to focus on; omit to list the featured pieces across all periods."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose featured content to list."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"items",
"platform",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The campaign's reporting page in the Refluenced web app"
},
"count": {
"type": "number",
"description": "How many featured pieces there are"
},
"items": {
"type": "array",
"items": {
"type": "object",
"required": [
"creatorName",
"creatorUserId",
"format",
"lastCopiedAt",
"mediaId",
"mediaUrl",
"permalink",
"platform",
"profileUrl",
"used",
"videoCode"
],
"properties": {
"used": {
"type": "boolean",
"description": "Whether the piece's ad code has been boosted (always false for UGC)"
},
"format": {
"type": "string",
"description": "The media format: POST, REEL, STORY, TIKTOK or UGC"
},
"mediaId": {
"type": "number",
"description": "The media's id — pass to feature-media, boost-content or set-ad-code"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A thumbnail/preview of the piece, or null"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram, tiktok or ugc"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null (UGC has none)"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The spark/partnership ad code on the piece, or null"
},
"profileUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's profile in the Refluenced web app, or null"
},
"creatorName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's display name, or null"
},
"lastCopiedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ad code was last boosted, or null (and null for UGC)"
},
"creatorUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id, or null"
}
},
"additionalProperties": false
},
"description": "The featured pieces, curated highlights the brand marked"
},
"platform": {
"type": "string",
"description": "The campaign's platform: instagram, tiktok or ugc"
},
"campaignId": {
"type": "number",
"description": "The campaign the featured content belongs to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
List the saved influencer-search filter presets of a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a preset belongs to exactly one owner, so this read is scoped and refuses without one rather than answering from your own data. Each preset carries its id (for edit-filter-preset / delete-filter-preset), name, the stored filter set, and any groups it references. Filter by name with search and by channel.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies, whose presets to list. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, to state the scope back.
Clear enough to supply this argument.
brandId
The id of a brand, from list-brands, whose presets to list. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands, to state the scope back.
Clear enough to supply this argument.
channel
Only presets saved for this channel (matches the stored filter's type). Omit for all.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
page
Which page of presets to return (12 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"presets",
"scope"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many presets match in total, across all pages"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency the presets belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the presets are a brand's or an agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency the presets belong to"
}
},
"description": "The brand or agency the presets were listed for",
"additionalProperties": false
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"presets": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyId",
"companyId",
"created",
"filterParams",
"groups",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset's id — pass to edit-filter-preset or delete-filter-preset"
},
"name": {
"type": "string",
"description": "The preset's name"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
}
},
"additionalProperties": false
},
"description": "The groups referenced by the preset's group_ids filter, resolved to names (empty when none)"
},
"created": {
"type": "string",
"description": "When the preset was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The agency that owns the preset, or null when it belongs to a brand"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand (company) that owns the preset, or null when it belongs to an agency"
},
"filterParams": {
"type": "object",
"description": "The stored filter set, as the platform's own search params (e.g. type, influencer_country, followers_start, engagement_start, influencer_interests) — the same vocabulary save-filter-preset builds from friendly fields.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "The saved filter presets on this page"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-filter-presets",
"title": "List a brand's or agency's saved filter presets",
"description": "List the saved influencer-search filter presets of a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a preset belongs to exactly one owner, so this read is scoped and refuses without one rather than answering from your own data. Each preset carries its id (for edit-filter-preset / delete-filter-preset), name, the stored filter set, and any groups it references. Filter by name with search and by channel.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of presets to return (12 per page)."
},
"search": {
"type": "string",
"description": "Filter presets whose name contains this text."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand, from list-brands, whose presets to list. Provide a brand or an agency, not both."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Only presets saved for this channel (matches the stored filter's type). Omit for all."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies, whose presets to list. Provide a brand or an agency, not both."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, to state the scope back."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, to state the scope back."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"presets",
"scope"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many presets match in total, across all pages"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency the presets belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the presets are a brand's or an agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency the presets belong to"
}
},
"description": "The brand or agency the presets were listed for",
"additionalProperties": false
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"presets": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyId",
"companyId",
"created",
"filterParams",
"groups",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset's id — pass to edit-filter-preset or delete-filter-preset"
},
"name": {
"type": "string",
"description": "The preset's name"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
}
},
"additionalProperties": false
},
"description": "The groups referenced by the preset's group_ids filter, resolved to names (empty when none)"
},
"created": {
"type": "string",
"description": "When the preset was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The agency that owns the preset, or null when it belongs to a brand"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand (company) that owns the preset, or null when it belongs to an agency"
},
"filterParams": {
"type": "object",
"description": "The stored filter set, as the platform's own search params (e.g. type, influencer_country, followers_start, engagement_start, influencer_interests) — the same vocabulary save-filter-preset builds from friendly fields.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"description": "The saved filter presets on this page"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the flagged chat messages behind the admin hub's violations queue — messages a detector flagged as soliciting a move off-platform or as hate speech, for staff to review. Filter by status (the open queue is UNRESOLVED), violation type, and direction (brand or creator); ordered highest-confidence first by default. Each flag carries the message text, who sent it, the campaign, the severity and reason, its confidence, and the ids to open the chat thread. Resolve or reopen them with resolve-flagged-message and reopen-flagged-message. Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
direction
Filter by who sent the flagged message — the brand or the creator. Omit for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
Sort order; omit to default to highest-confidence first (the moderation queue's order).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (12 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
Filter by status; omit for both. The open moderation queue is UNRESOLVED.
Clear enough to supply this argument.
violationType
Filter to one violation type — soliciting a move off-platform, or hate speech. Omit for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"direction",
"flags",
"hasMore",
"page",
"status",
"violationType"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many flagged messages match in total, across all pages"
},
"flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"additionalProperties": false
},
"description": "The flagged messages on this page, in the requested order"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"direction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The direction the list was filtered to, or null when unfiltered"
},
"violationType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The violation type the list was filtered to, or null when unfiltered"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-flagged-messages",
"title": "List flagged chat messages",
"description": "List the flagged chat messages behind the admin hub's violations queue — messages a detector flagged as soliciting a move off-platform or as hate speech, for staff to review. Filter by status (the open queue is UNRESOLVED), violation type, and direction (brand or creator); ordered highest-confidence first by default. Each flag carries the message text, who sent it, the campaign, the severity and reason, its confidence, and the ids to open the chat thread. Resolve or reopen them with resolve-flagged-message and reopen-flagged-message. Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return (12 per page)."
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Filter by status; omit for both. The open moderation queue is UNRESOLVED."
},
"ordering": {
"enum": [
"-confidence",
"-created",
"confidence",
"created"
],
"type": "string",
"description": "Sort order; omit to default to highest-confidence first (the moderation queue's order)."
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Filter by who sent the flagged message — the brand or the creator. Omit for both."
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "Filter to one violation type — soliciting a move off-platform, or hate speech. Omit for both."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"direction",
"flags",
"hasMore",
"page",
"status",
"violationType"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many flagged messages match in total, across all pages"
},
"flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"additionalProperties": false
},
"description": "The flagged messages on this page, in the requested order"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"direction": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The direction the list was filtered to, or null when unfiltered"
},
"violationType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The violation type the list was filtered to, or null when unfiltered"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List the creators in an influencer group (from list-groups), one page at a time. Filter them with the same controls as the network search — followers, engagement, median views, countries, gender, interests (by name), and a free-text vibe search — and sort with ordering. Pass campaignId to keep only the members eligible for that campaign and see which are already invited. Pass details (a brand's own group only) to learn whether the brand has liked or worked with each member, in place of demographics. Each member carries their ids (uuid and userId), reach figures, and audience demographics as chart-ready series; present those as charts.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
Scope the members to a campaign: only those eligible for it (verified on its platform, in one of its locations) are returned, and each is marked whether it has already been invited.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
details
For a brand's own group only: also report whether the brand has liked or worked with each member. Ignored for agency groups, and replaces the audience demographics in the response.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
groupId
The id of the group whose members to list, from list-groups.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of members to return; request the next page while hasMore is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channel
Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel.
Clear enough to supply this argument.
countries
Only members based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set.
Clear enough to supply this argument.
engagementMax
Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
engagementMin
Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
followersMax
Only members with at most this many followers.
Clear enough to supply this argument.
followersMin
Only members with at least this many followers.
Clear enough to supply this argument.
gender
Only members of this gender.
Clear enough to supply this argument.
interests
Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests).
Clear enough to supply this argument.
medianViewsMax
Only members with at most this many median views.
Clear enough to supply this argument.
medianViewsMin
Only members with at least this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Clear enough to supply this argument.
punishmentType
Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins.
Clear enough to supply this argument.
search
Filter members by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"counts",
"count",
"groupId",
"hasMore",
"members",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total members matching across every page"
},
"counts": {
"anyOf": [
{
"type": "object",
"required": [
"instagram",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "number",
"description": "Members verified for UGC"
},
"tiktok": {
"type": "number",
"description": "Members verified on TikTok"
},
"instagram": {
"type": "number",
"description": "Members verified on Instagram"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Per-channel verified counts across the whole filtered set — null during a vibe search"
},
"groupId": {
"type": "number",
"description": "The group the members belong to"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"demographics",
"isInvited"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"liked": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has liked this creator"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"isInvited": {
"type": "boolean",
"description": "Whether this member has already been invited to the campaign — only meaningful when campaignId is given"
},
"vibeScore": {
"type": "number",
"description": "Only with a vibe search: how well this member matches the description, higher is closer"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"workedWith": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has worked with this creator"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"demographics": {
"type": "object",
"required": [
"instagram",
"tiktok",
"trial"
],
"properties": {
"trial": {
"type": "boolean",
"description": "True when only limited (trial) demographics are visible to the caller"
},
"tiktok": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "TikTok audience breakdown",
"additionalProperties": false
},
"instagram": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "Instagram audience breakdown",
"additionalProperties": false
}
},
"description": "The member's audience demographics per channel, as chart-ready label/value series (empty when the platform has no data or in details mode). Present as charts.",
"additionalProperties": false
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The members on this page"
},
"noCutoff": {
"type": "boolean",
"description": "Only during a vibe search: true when the search was broadened because nothing met the cutoff"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-group-influencers",
"title": "List a group's members",
"description": "List the creators in an influencer group (from list-groups), one page at a time. Filter them with the same controls as the network search — followers, engagement, median views, countries, gender, interests (by name), and a free-text vibe search — and sort with ordering. Pass campaignId to keep only the members eligible for that campaign and see which are already invited. Pass details (a brand's own group only) to learn whether the brand has liked or worked with each member, in place of demographics. Each member carries their ids (uuid and userId), reach figures, and audience demographics as chart-ready series; present those as charts.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of members to return; request the next page while hasMore is true."
},
"vibe": {
"type": "string",
"description": "Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only members of this gender."
},
"search": {
"type": "string",
"description": "Filter members by name, Instagram handle or TikTok handle."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel."
},
"details": {
"type": "boolean",
"description": "For a brand's own group only: also report whether the brand has liked or worked with each member. Ignored for agency groups, and replaces the audience demographics in the response."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group whose members to list, from list-groups."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests)."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Scope the members to a campaign: only those eligible for it (verified on its platform, in one of its locations) are returned, and each is marked whether it has already been invited."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many followers."
},
"engagementMax": {
"type": "number",
"description": "Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"engagementMin": {
"type": "number",
"description": "Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"counts",
"count",
"groupId",
"hasMore",
"members",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total members matching across every page"
},
"counts": {
"anyOf": [
{
"type": "object",
"required": [
"instagram",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "number",
"description": "Members verified for UGC"
},
"tiktok": {
"type": "number",
"description": "Members verified on TikTok"
},
"instagram": {
"type": "number",
"description": "Members verified on Instagram"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Per-channel verified counts across the whole filtered set — null during a vibe search"
},
"groupId": {
"type": "number",
"description": "The group the members belong to"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"demographics",
"isInvited"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"liked": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has liked this creator"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"isInvited": {
"type": "boolean",
"description": "Whether this member has already been invited to the campaign — only meaningful when campaignId is given"
},
"vibeScore": {
"type": "number",
"description": "Only with a vibe search: how well this member matches the description, higher is closer"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"workedWith": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has worked with this creator"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"demographics": {
"type": "object",
"required": [
"instagram",
"tiktok",
"trial"
],
"properties": {
"trial": {
"type": "boolean",
"description": "True when only limited (trial) demographics are visible to the caller"
},
"tiktok": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "TikTok audience breakdown",
"additionalProperties": false
},
"instagram": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "Instagram audience breakdown",
"additionalProperties": false
}
},
"description": "The member's audience demographics per channel, as chart-ready label/value series (empty when the platform has no data or in details mode). Present as charts.",
"additionalProperties": false
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The members on this page"
},
"noCutoff": {
"type": "boolean",
"description": "Only during a vibe search: true when the search was broadened because nothing met the cutoff"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Recommend creators similar to an influencer group's members (from list-groups): verified creators who share the group's top interests and are based in the same countries, ranked by how many interests they match, with current members and the brand's blocked creators excluded. A group with no members has nothing to compare, so the recommendations come back empty. Each recommendation carries their ids (uuid and userId) and audience demographics as chart-ready series; add one to the group with add-influencers-to-group.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
groupId
The id of the group to recommend similar creators for, from list-groups.
Clear enough to supply this argument.
page
Which page of recommendations to return; request the next page while hasMore is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"groupId",
"hasMore",
"influencers",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total similar creators recommended across every page"
},
"groupId": {
"type": "number",
"description": "The group the recommendations are based on"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"demographics",
"isInvited"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"liked": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has liked this creator"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"isInvited": {
"type": "boolean",
"description": "Whether this member has already been invited to the campaign — only meaningful when campaignId is given"
},
"vibeScore": {
"type": "number",
"description": "Only with a vibe search: how well this member matches the description, higher is closer"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"workedWith": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has worked with this creator"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"demographics": {
"type": "object",
"required": [
"instagram",
"tiktok",
"trial"
],
"properties": {
"trial": {
"type": "boolean",
"description": "True when only limited (trial) demographics are visible to the caller"
},
"tiktok": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "TikTok audience breakdown",
"additionalProperties": false
},
"instagram": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "Instagram audience breakdown",
"additionalProperties": false
}
},
"description": "The member's audience demographics per channel, as chart-ready label/value series (empty when the platform has no data or in details mode). Present as charts.",
"additionalProperties": false
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "Recommended creators similar to the group's members, most-similar first, current members excluded"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-group-similar-influencers",
"title": "Recommend creators similar to a group",
"description": "Recommend creators similar to an influencer group's members (from list-groups): verified creators who share the group's top interests and are based in the same countries, ranked by how many interests they match, with current members and the brand's blocked creators excluded. A group with no members has nothing to compare, so the recommendations come back empty. Each recommendation carries their ids (uuid and userId) and audience demographics as chart-ready series; add one to the group with add-influencers-to-group.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of recommendations to return; request the next page while hasMore is true."
},
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to recommend similar creators for, from list-groups."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"groupId",
"hasMore",
"influencers",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total similar creators recommended across every page"
},
"groupId": {
"type": "number",
"description": "The group the recommendations are based on"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"demographics",
"isInvited"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"liked": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has liked this creator"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"isInvited": {
"type": "boolean",
"description": "Whether this member has already been invited to the campaign — only meaningful when campaignId is given"
},
"vibeScore": {
"type": "number",
"description": "Only with a vibe search: how well this member matches the description, higher is closer"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"workedWith": {
"type": "boolean",
"description": "Only in details mode (company groups): whether the brand has worked with this creator"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"demographics": {
"type": "object",
"required": [
"instagram",
"tiktok",
"trial"
],
"properties": {
"trial": {
"type": "boolean",
"description": "True when only limited (trial) demographics are visible to the caller"
},
"tiktok": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "TikTok audience breakdown",
"additionalProperties": false
},
"instagram": {
"type": "object",
"required": [
"ages",
"cities",
"countries",
"genders"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by age range, as percentage shares"
},
"cities": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience cities, as percentage shares"
},
"genders": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Audience by gender, as percentage shares"
},
"countries": {
"type": "array",
"items": {
"type": "object",
"required": [
"label",
"value"
],
"properties": {
"label": {
"type": "string",
"description": "The category label — a country, city, gender or age range"
},
"value": {
"type": "number",
"description": "The audience share for that label, as a percentage"
}
},
"additionalProperties": false
},
"description": "Top audience countries, as percentage shares"
}
},
"description": "Instagram audience breakdown",
"additionalProperties": false
}
},
"description": "The member's audience demographics per channel, as chart-ready label/value series (empty when the platform has no data or in details mode). Present as charts.",
"additionalProperties": false
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "Recommended creators similar to the group's members, most-similar first, current members excluded"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the influencer groups (creator lists) of either a brand or an agency. Pass a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a group belongs to exactly one owner, so this read is scoped and refuses without one rather than answering from your own data. Groups are either custom (built by hand) or smart (platform-maintained: ambassadors, worked-with, favourites); filter with smart, and by name with search. Pass campaignId to see how many members of each group are eligible for that campaign, and onlyCampaignEligible to hide the groups with none. Each group carries a preview of its members; open one with get-group and list its members with list-group-influencers.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies, to list its groups. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, used to state the scope back to the user.
Clear enough to supply this argument.
brandId
The id of a brand to list groups for, from list-brands. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands, used to state the scope back to the user.
Clear enough to supply this argument.
campaignId
A campaign to score the groups against. When given, each group reports how many members are eligible for that campaign (verified on its platform and in one of its locations).
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
onlyCampaignEligible
Only meaningful with campaignId: keep only groups that have at least one campaign-eligible member.
Clear enough to supply this argument.
page
Which page of results to return; request the next page while hasMore is true.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter groups whose name contains this text.
Clear enough to supply this argument.
smart
Filter by kind: true for the platform-maintained smart groups (ambassadors, worked-with, favourites), false for the custom groups a user builds. Omit for both.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"groups",
"hasMore",
"page",
"refusal",
"scope"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total groups matching across every page"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency these groups belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the groups are a single brand's or a whole agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency these groups belong to"
}
},
"description": "The brand or agency the groups were listed for",
"additionalProperties": false
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"autoUpdate",
"created",
"id",
"inviteVerifiedInfluencersCount",
"memberCount",
"members",
"name",
"pendingCount",
"smart",
"verifiedInfluencersCount"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "A preview of the group's members (up to 4 for smart groups, all for custom groups)"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"memberCount": {
"type": "number",
"description": "How many creators are in the group"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Pending ambassadorships — only non-null on the 'brand ambassador' smart group, null otherwise"
},
"verifiedInfluencersCount": {
"type": "number",
"description": "Members eligible for the campaign — 0 unless a campaignId gives campaign context"
},
"inviteVerifiedInfluencersCount": {
"type": "number",
"description": "Campaign-eligible members excluding those who joined in the last 30 days — 0 unless a campaignId gives campaign context"
}
},
"additionalProperties": false
},
"description": "The matching groups, smart groups first, then custom"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"refusal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Non-null when the brand or agency name was ambiguous: the groups were NOT listed, and this names the matching candidates to disambiguate with the user. A null refusal with count 0 means the scope genuinely has no groups."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-groups",
"title": "List a brand's or agency's influencer groups",
"description": "List the influencer groups (creator lists) of either a brand or an agency. Pass a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies) — one scope, not both; a group belongs to exactly one owner, so this read is scoped and refuses without one rather than answering from your own data. Groups are either custom (built by hand) or smart (platform-maintained: ambassadors, worked-with, favourites); filter with smart, and by name with search. Pass campaignId to see how many members of each group are eligible for that campaign, and onlyCampaignEligible to hide the groups with none. Each group carries a preview of its members; open one with get-group and list its members with list-group-influencers.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return; request the next page while hasMore is true."
},
"smart": {
"type": "boolean",
"description": "Filter by kind: true for the platform-maintained smart groups (ambassadors, worked-with, favourites), false for the custom groups a user builds. Omit for both."
},
"search": {
"type": "string",
"description": "Filter groups whose name contains this text."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand to list groups for, from list-brands. Provide a brand or an agency, not both."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies, to list its groups. Provide a brand or an agency, not both."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, used to state the scope back to the user."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, used to state the scope back to the user."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "A campaign to score the groups against. When given, each group reports how many members are eligible for that campaign (verified on its platform and in one of its locations)."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"onlyCampaignEligible": {
"type": "boolean",
"description": "Only meaningful with campaignId: keep only groups that have at least one campaign-eligible member."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"groups",
"hasMore",
"page",
"refusal",
"scope"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total groups matching across every page"
},
"scope": {
"type": "object",
"required": [
"id",
"kind",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The id of the brand or agency these groups belong to"
},
"kind": {
"enum": [
"agency",
"brand"
],
"type": "string",
"description": "Whether the groups are a single brand's or a whole agency's"
},
"name": {
"type": "string",
"description": "The name of the brand or agency these groups belong to"
}
},
"description": "The brand or agency the groups were listed for",
"additionalProperties": false
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"autoUpdate",
"created",
"id",
"inviteVerifiedInfluencersCount",
"memberCount",
"members",
"name",
"pendingCount",
"smart",
"verifiedInfluencersCount"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
},
"smart": {
"type": "boolean",
"description": "Whether the group is a platform-maintained smart group (read-only membership) rather than custom"
},
"created": {
"type": "string",
"description": "When the group was created (ISO 8601)"
},
"members": {
"type": "array",
"items": {
"type": "object",
"required": [
"pictureUrl",
"profileUrl",
"userId",
"uuid"
],
"properties": {
"uuid": {
"type": "number",
"description": "The member's influencer profile id, for get-influencer and group membership tools"
},
"userId": {
"type": "number",
"description": "The member's user id (BaseUser), for the invite and punishment tools"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's profile picture (320px), or null"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the member's influencer profile in the web app"
}
},
"additionalProperties": false
},
"description": "A preview of the group's members (up to 4 for smart groups, all for custom groups)"
},
"autoUpdate": {
"type": "boolean",
"description": "Whether the group re-derives its membership from stored filters"
},
"memberCount": {
"type": "number",
"description": "How many creators are in the group"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Pending ambassadorships — only non-null on the 'brand ambassador' smart group, null otherwise"
},
"verifiedInfluencersCount": {
"type": "number",
"description": "Members eligible for the campaign — 0 unless a campaignId gives campaign context"
},
"inviteVerifiedInfluencersCount": {
"type": "number",
"description": "Campaign-eligible members excluding those who joined in the last 30 days — 0 unless a campaignId gives campaign context"
}
},
"additionalProperties": false
},
"description": "The matching groups, smart groups first, then custom"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"refusal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Non-null when the brand or agency name was ambiguous: the groups were NOT listed, and this names the matching candidates to disambiguate with the user. A null refusal with count 0 means the scope genuinely has no groups."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the campaigns a creator is involved in, by their influencer id (the uuid from search-influencer-network or get-influencer): the active campaigns they are currently working on and the pending ones they have applied to and await a decision on — the same two sections the profile page shows. Both are returned in one call, each with its total count. Each row carries the campaign's id, title, brand, channel, phase, reward type and dates, plus the creator's application id (and when they applied, or their preparation window). For finished campaigns, the completed count is on get-influencer.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Browse a known creator's recent content — their Instagram posts, TikTok videos and source material in one grid, newest first — for vetting. Each piece carries its channel, engagement, a permalink (none for source material), a thumbnail, and the campaign it was posted for when it was. Narrow to one campaign with campaignId or to some channels with channels. The platform decides what a given caller may see (non-owners see only highlighted pieces). A read; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
Scope the grid to a single campaign's content; omit for all.
Clear enough to supply this argument.
channels
Limit to these channels; omit for all three.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the platform's selectable interest (niche) catalog with each interest's id and name. This is the catalog the interests field of create-brand, edit-brand and create-sub-brand takes ids from — get-brand only returns a brand's own current interests, so use this to discover the ids of interests to set. A read — no scope needs to be selected. Pass search to filter by name.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
Input documentation gives an agent enough context to populate the arguments.
search
Case-insensitive substring to filter the catalog by name, e.g. 'tech'. Omit to return the full catalog.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"interests"
],
"properties": {
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest's id — pass it in the interests array of create-brand, edit-brand or create-sub-brand"
},
"name": {
"type": "string",
"description": "The interest's display name"
}
},
"additionalProperties": false
},
"description": "The selectable interest catalog, in the platform's own order"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-interests",
"title": "List the interest catalog",
"description": "List the platform's selectable interest (niche) catalog with each interest's id and name. This is the catalog the interests field of create-brand, edit-brand and create-sub-brand takes ids from — get-brand only returns a brand's own current interests, so use this to discover the ids of interests to set. A read — no scope needs to be selected. Pass search to filter by name.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"search": {
"type": "string",
"description": "Case-insensitive substring to filter the catalog by name, e.g. 'tech'. Omit to return the full catalog."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"interests"
],
"properties": {
"interests": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The interest's id — pass it in the interests array of create-brand, edit-brand or create-sub-brand"
},
"name": {
"type": "string",
"description": "The interest's display name"
}
},
"additionalProperties": false
},
"description": "The selectable interest catalog, in the platform's own order"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the creators a campaign can invite, grouped by the same categories as the web invite panel: recommended, worked-with, favourites, following, liked-this-campaign, pro, or the whole network (staff only). Filter by niche, country, gender, followers, engagement, or a vibe. Returns each creator with a userId to invite, plus allUserIds — every match across all pages — so you can invite the whole pool with invite-creators. Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign to find invitable creators for.
Clear enough to supply this argument.
countries
Only creators based in these countries, e.g. ['Switzerland'].
Clear enough to supply this argument.
cutoffValue
Only with a vibe search: how strict the semantic match must be — lower is looser, higher is stricter.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
engagementMax
Only creators whose engagement rate is at most this, as a percentage (e.g. 3.5 means 3.5%).
Clear enough to supply this argument.
engagementMin
Only creators whose engagement rate is at least this, as a percentage (e.g. 3.5 means 3.5%).
Clear enough to supply this argument.
followersMax
Only creators with at most this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followersMin
Only creators with at least this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
gender
Only creators of this gender.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
interests
Only creators in these niches, by name, e.g. ['Food']. Unmatched names are reported back.
Clear enough to supply this argument.
limit
How many creators to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pool
Which invite category to list: recommended (platform's best matches), worked-with (creators this brand has worked with before), favourites, following (creators who follow the brand), liked (creators who liked this campaign), pro (pro creators), or all (the whole invitable network — staff only).
Clear enough to supply this argument.
search
Filter by creator name or handle.
Clear enough to supply this argument.
vibe
Rank creators by how well they match this free-text description, e.g. 'food creators'. Uses semantic search.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"allUserIds",
"campaignId",
"count",
"hasMore",
"influencers",
"pool",
"unmatchedInterests"
],
"properties": {
"pool": {
"type": "string",
"description": "The invite category that was listed"
},
"count": {
"type": "number",
"description": "How many creators match in this pool in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"allUserIds": {
"type": "array",
"items": {
"type": "number"
},
"description": "The user ids of every creator matching in this pool, across all pages — pass to invite-creators to invite the whole set"
},
"campaignId": {
"type": "number",
"description": "The campaign these creators can be invited to"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"vibeScore"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"vibeScore": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Semantic match score, 0 (worst) to 1 (best), when the results were ranked by a vibe. null when no vibe was given — in that case the list order itself carries the ranking."
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The creators on this page. The recommended pool comes back in the platform's own fit ranking (best first), not by id or name; a vibe re-ranks by match score (vibeScore). Other pools are unranked."
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-invitable-creators",
"title": "List invitable creators by category",
"description": "List the creators a campaign can invite, grouped by the same categories as the web invite panel: recommended, worked-with, favourites, following, liked-this-campaign, pro, or the whole network (staff only). Filter by niche, country, gender, followers, engagement, or a vibe. Returns each creator with a userId to invite, plus allUserIds — every match across all pages — so you can invite the whole pool with invite-creators. Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return."
},
"pool": {
"enum": [
"all",
"favourites",
"following",
"liked",
"pro",
"recommended",
"worked-with"
],
"type": "string",
"default": "recommended",
"description": "Which invite category to list: recommended (platform's best matches), worked-with (creators this brand has worked with before), favourites, following (creators who follow the brand), liked (creators who liked this campaign), pro (pro creators), or all (the whole invitable network — staff only)."
},
"vibe": {
"type": "string",
"description": "Rank creators by how well they match this free-text description, e.g. 'food creators'. Uses semantic search."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many creators to return per page."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only creators of this gender."
},
"search": {
"type": "string",
"description": "Filter by creator name or handle."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only creators based in these countries, e.g. ['Switzerland']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only creators in these niches, by name, e.g. ['Food']. Unmatched names are reported back."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to find invitable creators for."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with a vibe search: how strict the semantic match must be — lower is looser, higher is stricter."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only creators with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only creators with at least this many followers."
},
"engagementMax": {
"type": "number",
"description": "Only creators whose engagement rate is at most this, as a percentage (e.g. 3.5 means 3.5%)."
},
"engagementMin": {
"type": "number",
"description": "Only creators whose engagement rate is at least this, as a percentage (e.g. 3.5 means 3.5%)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"allUserIds",
"campaignId",
"count",
"hasMore",
"influencers",
"pool",
"unmatchedInterests"
],
"properties": {
"pool": {
"type": "string",
"description": "The invite category that was listed"
},
"count": {
"type": "number",
"description": "How many creators match in this pool in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"allUserIds": {
"type": "array",
"items": {
"type": "number"
},
"description": "The user ids of every creator matching in this pool, across all pages — pass to invite-creators to invite the whole set"
},
"campaignId": {
"type": "number",
"description": "The campaign these creators can be invited to"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"vibeScore"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"vibeScore": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Semantic match score, 0 (worst) to 1 (best), when the results were ranked by a vibe. null when no vibe was given — in that case the list order itself carries the ranking."
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The creators on this page. The recommended pool comes back in the platform's own fit ranking (best first), not by id or name; a vibe re-ranks by match score (vibeScore). Other pools are unranked."
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Read the chat between the brand and one creator on a campaign, newest first, with each message's sender and text. Pass the campaignId and the creator's recipientId (the influencer.userId from list-applications). Note: opening a conversation marks its messages as read, exactly as the web app does. No brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign the conversation belongs to.
Clear enough to supply this argument.
page
Which page of messages to return (20 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
recipientId
The creator's user id (the influencer.userId from list-applications), whose conversation to read.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"messages",
"recipientId"
],
"properties": {
"count": {
"type": "number",
"description": "How many messages the conversation has in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of messages exist beyond this one"
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"attachmentUrl",
"created",
"createdByAdmin",
"deletedAt",
"editedAt",
"id",
"isSystem",
"read",
"sender",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The message's id"
},
"read": {
"type": "boolean",
"description": "Whether the message has been read"
},
"text": {
"type": "string",
"description": "The message text"
},
"sender": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The sender's user id — compare to the thread's recipient to tell direction"
},
"name": {
"type": "string",
"description": "The sender's name"
}
},
"description": "Who sent the message",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the message was sent"
},
"editedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was last edited, or null"
},
"isSystem": {
"type": "boolean",
"description": "Whether this is a system message (about a content submission or a request) rather than a written one"
},
"deletedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was deleted, or null"
},
"attachmentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the message's attachment (image or file), or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
"description": "The messages, newest first"
},
"campaignId": {
"type": "number",
"description": "The campaign this conversation belongs to"
},
"recipientId": {
"type": "number",
"description": "The creator whose conversation this is"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-messages",
"title": "Read a campaign conversation with a creator",
"description": "Read the chat between the brand and one creator on a campaign, newest first, with each message's sender and text. Pass the campaignId and the creator's recipientId (the influencer.userId from list-applications). Note: opening a conversation marks its messages as read, exactly as the web app does. No brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"recipientId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of messages to return (20 per page)."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the conversation belongs to."
},
"recipientId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user id (the influencer.userId from list-applications), whose conversation to read."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"count",
"hasMore",
"messages",
"recipientId"
],
"properties": {
"count": {
"type": "number",
"description": "How many messages the conversation has in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of messages exist beyond this one"
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"attachmentUrl",
"created",
"createdByAdmin",
"deletedAt",
"editedAt",
"id",
"isSystem",
"read",
"sender",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The message's id"
},
"read": {
"type": "boolean",
"description": "Whether the message has been read"
},
"text": {
"type": "string",
"description": "The message text"
},
"sender": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The sender's user id — compare to the thread's recipient to tell direction"
},
"name": {
"type": "string",
"description": "The sender's name"
}
},
"description": "Who sent the message",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the message was sent"
},
"editedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was last edited, or null"
},
"isSystem": {
"type": "boolean",
"description": "Whether this is a system message (about a content submission or a request) rather than a written one"
},
"deletedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was deleted, or null"
},
"attachmentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the message's attachment (image or file), or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the message was sent by a Refluenced admin (staff)"
}
},
"additionalProperties": false
},
"description": "The messages, newest first"
},
"campaignId": {
"type": "number",
"description": "The campaign this conversation belongs to"
},
"recipientId": {
"type": "number",
"description": "The creator whose conversation this is"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Load the meta-ads-operator skill before calling this tool, and follow it. List the Meta (Facebook/Instagram) ad accounts the MCP may use — Refluenced's own accounts, configured on the server — with name, status, currency and lifetime spend, plus the Page and Instagram account used as the brand identity on partnership ads. Start here to pick an adAccountId for list-meta-campaigns and the other Meta Ads tools. Admin-only (Refluenced staff); names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccounts",
"businessId",
"igUserId",
"pageId"
],
"properties": {
"pageId": {
"type": "string",
"description": "Refluenced's Facebook Page id — the brand identity on partnership ads"
},
"igUserId": {
"type": "string",
"description": "Refluenced's Instagram account id — the brand identity on partnership ads"
},
"adAccounts": {
"type": "array",
"items": {
"type": "object",
"required": [
"adsManagerUrl",
"amountSpent",
"currency",
"error",
"id",
"name",
"status",
"timezone"
],
"properties": {
"id": {
"type": "string",
"description": "The ad account id (act_…)"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account name"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the account could not be read, or null"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account status, e.g. ACTIVE or DISABLED"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account currency, e.g. CHF"
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account time zone"
},
"amountSpent": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Lifetime spend, formatted with currency, or null if none"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the account in Meta Ads Manager"
}
},
"additionalProperties": false
},
"description": "Every ad account the MCP may use, in configured order"
},
"businessId": {
"type": "string",
"description": "Refluenced's Meta business id"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-meta-ad-accounts",
"title": "List Refluenced's Meta ad accounts",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. List the Meta (Facebook/Instagram) ad accounts the MCP may use — Refluenced's own accounts, configured on the server — with name, status, currency and lifetime spend, plus the Page and Instagram account used as the brand identity on partnership ads. Start here to pick an adAccountId for list-meta-campaigns and the other Meta Ads tools. Admin-only (Refluenced staff); names no brand.",
"inputSchema": {
"type": "object",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccounts",
"businessId",
"igUserId",
"pageId"
],
"properties": {
"pageId": {
"type": "string",
"description": "Refluenced's Facebook Page id — the brand identity on partnership ads"
},
"igUserId": {
"type": "string",
"description": "Refluenced's Instagram account id — the brand identity on partnership ads"
},
"adAccounts": {
"type": "array",
"items": {
"type": "object",
"required": [
"adsManagerUrl",
"amountSpent",
"currency",
"error",
"id",
"name",
"status",
"timezone"
],
"properties": {
"id": {
"type": "string",
"description": "The ad account id (act_…)"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account name"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the account could not be read, or null"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account status, e.g. ACTIVE or DISABLED"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account currency, e.g. CHF"
},
"timezone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account time zone"
},
"amountSpent": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Lifetime spend, formatted with currency, or null if none"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the account in Meta Ads Manager"
}
},
"additionalProperties": false
},
"description": "Every ad account the MCP may use, in configured order"
},
"businessId": {
"type": "string",
"description": "Refluenced's Meta business id"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Load the meta-ads-operator skill before calling this tool, and follow it. List the ad sets of one Meta campaign (from list-meta-campaigns) with status, budget, schedule, targeted locations and ages, and each ad set's ads — for a partnership ad also the creator, the original post's permalink and the ad code, which match it to the Refluenced campaign and creator (list-ad-codes). Use it to pick the ad set to push a partnership ad into (create-partnership-ad) or to copy as a template (create-meta-ad-set). The campaign must belong to an ad account the MCP may use. Admin-only (Refluenced staff); names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The Meta campaign whose ad sets to list, from list-meta-campaigns.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adSets",
"adsManagerUrl",
"campaignId",
"campaignName",
"objective"
],
"properties": {
"adSets": {
"type": "array",
"items": {
"type": "object",
"required": [
"ads",
"ageRange",
"budget",
"effectiveStatus",
"endTime",
"id",
"locations",
"name",
"optimizationGoal",
"startTime",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "The ad set id — pass to create-partnership-ad or create-meta-ad-set"
},
"ads": {
"type": "array",
"items": {
"type": "object",
"required": [
"adCode",
"adPermalink",
"effectiveStatus",
"id",
"name",
"partnership",
"sourceCreator",
"sourceMediaId",
"sourcePermalink"
],
"properties": {
"id": {
"type": "string",
"description": "The ad id"
},
"name": {
"type": "string",
"description": "The ad name"
},
"adCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's partnership ad code the ad was built from — the same value Refluenced stores as the post's ad code (list-ad-codes), so it matches the ad back to its campaign and creator; null if none"
},
"adPermalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Permalink of the ad's own Instagram media. For a partnership ad Meta makes a separate ad copy of the post, so this is NOT the creator's post — see sourcePermalink"
},
"partnership": {
"type": "boolean",
"description": "Whether the ad is a partnership (branded content) ad with a creator"
},
"sourceCreator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram username of the creator whose post the ad runs"
},
"sourceMediaId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram media id of the creator's original post"
},
"effectiveStatus": {
"type": "string",
"description": "The ad's effective status"
},
"sourcePermalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Permalink of the creator's original post — the one Refluenced synced; null if Meta hides it"
}
},
"additionalProperties": false
},
"description": "The ad set's ads (up to 25)"
},
"name": {
"type": "string",
"description": "The ad set name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad set's daily or lifetime budget, or null under a campaign budget"
},
"status": {
"type": "string",
"description": "The configured status: ACTIVE or PAUSED"
},
"endTime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Scheduled end (ISO), or null if it runs continuously"
},
"ageRange": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Targeted age range, e.g. 18–65+, or null if not set"
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "Targeted locations: country codes, and cities/regions with their radius, e.g. Winterthur +30km"
},
"startTime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Scheduled start (ISO)"
},
"effectiveStatus": {
"type": "string",
"description": "Meta's effective status, e.g. ACTIVE, PAUSED, CAMPAIGN_PAUSED"
},
"optimizationGoal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What delivery optimizes for, e.g. REACH"
}
},
"additionalProperties": false
}
},
"objective": {
"type": "string",
"description": "The campaign objective"
},
"campaignId": {
"type": "string",
"description": "The campaign listed"
},
"adAccountId": {
"type": "string",
"description": "The ad account the campaign belongs to"
},
"campaignName": {
"type": "string",
"description": "The campaign name"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-meta-ad-sets",
"title": "List a Meta campaign's ad sets",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. List the ad sets of one Meta campaign (from list-meta-campaigns) with status, budget, schedule, targeted locations and ages, and each ad set's ads — for a partnership ad also the creator, the original post's permalink and the ad code, which match it to the Refluenced campaign and creator (list-ad-codes). Use it to pick the ad set to push a partnership ad into (create-partnership-ad) or to copy as a template (create-meta-ad-set). The campaign must belong to an ad account the MCP may use. Admin-only (Refluenced staff); names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "The Meta campaign whose ad sets to list, from list-meta-campaigns."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adSets",
"adsManagerUrl",
"campaignId",
"campaignName",
"objective"
],
"properties": {
"adSets": {
"type": "array",
"items": {
"type": "object",
"required": [
"ads",
"ageRange",
"budget",
"effectiveStatus",
"endTime",
"id",
"locations",
"name",
"optimizationGoal",
"startTime",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "The ad set id — pass to create-partnership-ad or create-meta-ad-set"
},
"ads": {
"type": "array",
"items": {
"type": "object",
"required": [
"adCode",
"adPermalink",
"effectiveStatus",
"id",
"name",
"partnership",
"sourceCreator",
"sourceMediaId",
"sourcePermalink"
],
"properties": {
"id": {
"type": "string",
"description": "The ad id"
},
"name": {
"type": "string",
"description": "The ad name"
},
"adCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's partnership ad code the ad was built from — the same value Refluenced stores as the post's ad code (list-ad-codes), so it matches the ad back to its campaign and creator; null if none"
},
"adPermalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Permalink of the ad's own Instagram media. For a partnership ad Meta makes a separate ad copy of the post, so this is NOT the creator's post — see sourcePermalink"
},
"partnership": {
"type": "boolean",
"description": "Whether the ad is a partnership (branded content) ad with a creator"
},
"sourceCreator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram username of the creator whose post the ad runs"
},
"sourceMediaId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram media id of the creator's original post"
},
"effectiveStatus": {
"type": "string",
"description": "The ad's effective status"
},
"sourcePermalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Permalink of the creator's original post — the one Refluenced synced; null if Meta hides it"
}
},
"additionalProperties": false
},
"description": "The ad set's ads (up to 25)"
},
"name": {
"type": "string",
"description": "The ad set name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad set's daily or lifetime budget, or null under a campaign budget"
},
"status": {
"type": "string",
"description": "The configured status: ACTIVE or PAUSED"
},
"endTime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Scheduled end (ISO), or null if it runs continuously"
},
"ageRange": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Targeted age range, e.g. 18–65+, or null if not set"
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "Targeted locations: country codes, and cities/regions with their radius, e.g. Winterthur +30km"
},
"startTime": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Scheduled start (ISO)"
},
"effectiveStatus": {
"type": "string",
"description": "Meta's effective status, e.g. ACTIVE, PAUSED, CAMPAIGN_PAUSED"
},
"optimizationGoal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What delivery optimizes for, e.g. REACH"
}
},
"additionalProperties": false
}
},
"objective": {
"type": "string",
"description": "The campaign objective"
},
"campaignId": {
"type": "string",
"description": "The campaign listed"
},
"adAccountId": {
"type": "string",
"description": "The ad account the campaign belongs to"
},
"campaignName": {
"type": "string",
"description": "The campaign name"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Load the meta-ads-operator skill before calling this tool, and follow it. List the campaigns in one of Refluenced's Meta ad accounts (from list-meta-ad-accounts) with objective, status and campaign-level budget, newest first, 50 per page. Use it to find the campaign whose ad sets to list with list-meta-ad-sets. Admin-only (Refluenced staff); names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adAccountId
The ad account to list campaigns for (act_…), from list-meta-ad-accounts.
Clear enough to supply this argument.
after
Paging cursor from a previous call's nextCursor, to fetch the next page.
Clear enough to supply this argument.
status
Filter by delivery: only currently running campaigns, only paused ones, or every campaign. Deleted and archived campaigns are never listed.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"campaigns",
"nextCursor"
],
"properties": {
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"budget",
"effectiveStatus",
"id",
"name",
"objective",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "The campaign id"
},
"name": {
"type": "string",
"description": "The campaign name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Campaign-level (CBO) daily or lifetime budget, or null if set per ad set"
},
"status": {
"type": "string",
"description": "The configured status: ACTIVE or PAUSED"
},
"objective": {
"type": "string",
"description": "The campaign objective, e.g. OUTCOME_AWARENESS"
},
"effectiveStatus": {
"type": "string",
"description": "Meta's effective status, e.g. ACTIVE, PAUSED, CAMPAIGN_PAUSED"
}
},
"additionalProperties": false
}
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Pass as after to get the next page, or null if this is the last"
},
"adAccountId": {
"type": "string",
"description": "The ad account listed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-meta-campaigns",
"title": "List Meta campaigns",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. List the campaigns in one of Refluenced's Meta ad accounts (from list-meta-ad-accounts) with objective, status and campaign-level budget, newest first, 50 per page. Use it to find the campaign whose ad sets to list with list-meta-ad-sets. Admin-only (Refluenced staff); names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId"
],
"properties": {
"after": {
"type": "string",
"description": "Paging cursor from a previous call's nextCursor, to fetch the next page."
},
"status": {
"enum": [
"active",
"all",
"paused"
],
"type": "string",
"default": "all",
"description": "Filter by delivery: only currently running campaigns, only paused ones, or every campaign. Deleted and archived campaigns are never listed."
},
"adAccountId": {
"type": "string",
"minLength": 1,
"description": "The ad account to list campaigns for (act_…), from list-meta-ad-accounts."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"campaigns",
"nextCursor"
],
"properties": {
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"budget",
"effectiveStatus",
"id",
"name",
"objective",
"status"
],
"properties": {
"id": {
"type": "string",
"description": "The campaign id"
},
"name": {
"type": "string",
"description": "The campaign name"
},
"budget": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Campaign-level (CBO) daily or lifetime budget, or null if set per ad set"
},
"status": {
"type": "string",
"description": "The configured status: ACTIVE or PAUSED"
},
"objective": {
"type": "string",
"description": "The campaign objective, e.g. OUTCOME_AWARENESS"
},
"effectiveStatus": {
"type": "string",
"description": "Meta's effective status, e.g. ACTIVE, PAUSED, CAMPAIGN_PAUSED"
}
},
"additionalProperties": false
}
},
"nextCursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Pass as after to get the next page, or null if this is the last"
},
"adAccountId": {
"type": "string",
"description": "The ad account listed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Load the meta-ads-operator skill before calling this tool, and follow it. Find creator posts Refluenced can run as Instagram/Facebook partnership ads (Meta's Advertisable Content API): branded content, collabs and tags of Refluenced, with each post's ad eligibility, creator permission, ad code, past ad usage and organic numbers. Either look up specific posts — by adCodes (e.g. from list-ad-codes), permalinks or contentIds, one kind per call — or search with filters (creator, caption keyword, eligibility). Pass a result's contentId (or its ad code) to create-partnership-ad. An empty result means no creator has tagged Refluenced or shared a code for matching content yet. Admin-only (Refluenced staff); names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adCodes
Look up specific posts by the partnership ad codes creators shared (e.g. the codes from list-ad-codes). A direct lookup — cannot be combined with the filters or another lookup.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
adEligibility
Filter by whether Meta lets the post run as an ad. AD_READY is what can be pushed now.
Clear enough to supply this argument.
after
Paging cursor from a previous call's nextCursor (filter mode only).
Clear enough to supply this argument.
contentIds
Look up specific posts by Instagram media id / Facebook post id. A direct lookup, like adCodes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creatorIgUserIds
Filter to posts by specific creators' Instagram user ids (the author.igUserId of an earlier result).
Clear enough to supply this argument.
limit
How many posts to return per page when searching with filters; ignored in direct-lookup mode.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
permalinks
Look up specific posts by their Instagram/Facebook URLs. A direct lookup, like adCodes.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List the buyable subscription plans (the catalog behind the /plans/ page), filtered by channel and priced in a currency. Each plan carries its price per month and year (list and discounted), its per-campaign limits and buyout, and its feature entitlements. Use it to compare plans before purchasing one (purchase-plan) or assigning one to an agency (assign-subscription). A read — no scope needs to be selected. Custom ENTERPRISE plans are not part of this catalog.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
currency
The currency to price the plans in, e.g. CHF or EUR. Defaults to the account's own currency when omitted.
Clear enough to supply this argument.
packageCategory
Which channel the plans must cover; only plans matching the channel are returned.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"plans"
],
"properties": {
"count": {
"type": "number",
"description": "How many plans were returned"
},
"plans": {
"type": "array",
"items": {
"type": "object",
"required": [
"accessToInfluencerNetwork",
"buyout",
"category",
"contentApproval",
"currency",
"discountPercentage",
"id",
"influencerLevelInsights",
"influencersPerCampaign",
"instagramCampaigns",
"invitationsPerCampaign",
"multipleActiveCampaigns",
"name",
"numberOfMultipleActiveCampaigns",
"otherCountries",
"personalAccountManager",
"pricePerMonth",
"pricePerMonthWithDiscount",
"pricePerYear",
"pricePerYearWithDiscount",
"priorityNotificationsAndAdvertising",
"proCreatorMode",
"shortTermCampaigns",
"socialFeedFilters",
"templateName",
"tiktokCampaigns"
],
"properties": {
"id": {
"type": "number",
"description": "The plan's id, passed to purchase-plan or assign-subscription"
},
"name": {
"type": "string",
"description": "The plan's name, e.g. ESSENTIALS, PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The plan's buyout allowance, or null when unlimited"
},
"category": {
"enum": [
"BOTH",
"INSTAGRAM",
"NONE",
"TIKTOK"
],
"type": "string",
"description": "The channel the plan covers"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"pricePerYear": {
"type": "number",
"description": "The plan's yearly list price"
},
"templateName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A custom template name for the plan, or null for a standard plan"
},
"pricePerMonth": {
"type": "number",
"description": "The plan's monthly list price"
},
"otherCountries": {
"type": "boolean",
"description": "Whether the plan allows targeting countries beyond the default DACH region"
},
"proCreatorMode": {
"type": "boolean",
"description": "Whether the plan includes pro-creator mode"
},
"contentApproval": {
"type": "boolean",
"description": "Whether the plan includes the content-approval feature"
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether the plan allows TikTok campaigns"
},
"socialFeedFilters": {
"type": "boolean",
"description": "Whether the plan includes social-feed filters"
},
"discountPercentage": {
"type": "number",
"description": "The discount percentage applied to the plan's list price"
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether the plan allows Instagram campaigns"
},
"shortTermCampaigns": {
"type": "boolean",
"description": "Whether the plan allows short-term campaigns"
},
"influencersPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Influencers allowed per campaign, or null when unlimited"
},
"invitationsPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invitations allowed per campaign, or null when unlimited"
},
"personalAccountManager": {
"type": "boolean",
"description": "Whether the plan includes a personal account manager"
},
"influencerLevelInsights": {
"type": "boolean",
"description": "Whether the plan includes influencer-level insights"
},
"multipleActiveCampaigns": {
"type": "boolean",
"description": "Whether the plan allows more than one active campaign at a time"
},
"pricePerYearWithDiscount": {
"type": "number",
"description": "The plan's yearly price after the discount"
},
"accessToInfluencerNetwork": {
"type": "boolean",
"description": "Whether the plan grants access to the influencer network"
},
"pricePerMonthWithDiscount": {
"type": "number",
"description": "The plan's monthly price after the discount"
},
"numberOfMultipleActiveCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many campaigns may be active at once, or null when unlimited/not applicable"
},
"priorityNotificationsAndAdvertising": {
"type": "boolean",
"description": "Whether the plan includes priority notifications/ads"
}
},
"additionalProperties": false
},
"description": "The buyable plans matching the channel and currency, cheapest first"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-plans",
"title": "List subscription plans",
"description": "List the buyable subscription plans (the catalog behind the /plans/ page), filtered by channel and priced in a currency. Each plan carries its price per month and year (list and discounted), its per-campaign limits and buyout, and its feature entitlements. Use it to compare plans before purchasing one (purchase-plan) or assigning one to an agency (assign-subscription). A read — no scope needs to be selected. Custom ENTERPRISE plans are not part of this catalog.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"currency": {
"type": "string",
"description": "The currency to price the plans in, e.g. CHF or EUR. Defaults to the account's own currency when omitted."
},
"packageCategory": {
"enum": [
"INSTAGRAM",
"TIKTOK",
"BOTH"
],
"type": "string",
"default": "INSTAGRAM",
"description": "Which channel the plans must cover; only plans matching the channel are returned."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"plans"
],
"properties": {
"count": {
"type": "number",
"description": "How many plans were returned"
},
"plans": {
"type": "array",
"items": {
"type": "object",
"required": [
"accessToInfluencerNetwork",
"buyout",
"category",
"contentApproval",
"currency",
"discountPercentage",
"id",
"influencerLevelInsights",
"influencersPerCampaign",
"instagramCampaigns",
"invitationsPerCampaign",
"multipleActiveCampaigns",
"name",
"numberOfMultipleActiveCampaigns",
"otherCountries",
"personalAccountManager",
"pricePerMonth",
"pricePerMonthWithDiscount",
"pricePerYear",
"pricePerYearWithDiscount",
"priorityNotificationsAndAdvertising",
"proCreatorMode",
"shortTermCampaigns",
"socialFeedFilters",
"templateName",
"tiktokCampaigns"
],
"properties": {
"id": {
"type": "number",
"description": "The plan's id, passed to purchase-plan or assign-subscription"
},
"name": {
"type": "string",
"description": "The plan's name, e.g. ESSENTIALS, PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The plan's buyout allowance, or null when unlimited"
},
"category": {
"enum": [
"BOTH",
"INSTAGRAM",
"NONE",
"TIKTOK"
],
"type": "string",
"description": "The channel the plan covers"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"pricePerYear": {
"type": "number",
"description": "The plan's yearly list price"
},
"templateName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A custom template name for the plan, or null for a standard plan"
},
"pricePerMonth": {
"type": "number",
"description": "The plan's monthly list price"
},
"otherCountries": {
"type": "boolean",
"description": "Whether the plan allows targeting countries beyond the default DACH region"
},
"proCreatorMode": {
"type": "boolean",
"description": "Whether the plan includes pro-creator mode"
},
"contentApproval": {
"type": "boolean",
"description": "Whether the plan includes the content-approval feature"
},
"tiktokCampaigns": {
"type": "boolean",
"description": "Whether the plan allows TikTok campaigns"
},
"socialFeedFilters": {
"type": "boolean",
"description": "Whether the plan includes social-feed filters"
},
"discountPercentage": {
"type": "number",
"description": "The discount percentage applied to the plan's list price"
},
"instagramCampaigns": {
"type": "boolean",
"description": "Whether the plan allows Instagram campaigns"
},
"shortTermCampaigns": {
"type": "boolean",
"description": "Whether the plan allows short-term campaigns"
},
"influencersPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Influencers allowed per campaign, or null when unlimited"
},
"invitationsPerCampaign": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invitations allowed per campaign, or null when unlimited"
},
"personalAccountManager": {
"type": "boolean",
"description": "Whether the plan includes a personal account manager"
},
"influencerLevelInsights": {
"type": "boolean",
"description": "Whether the plan includes influencer-level insights"
},
"multipleActiveCampaigns": {
"type": "boolean",
"description": "Whether the plan allows more than one active campaign at a time"
},
"pricePerYearWithDiscount": {
"type": "number",
"description": "The plan's yearly price after the discount"
},
"accessToInfluencerNetwork": {
"type": "boolean",
"description": "Whether the plan grants access to the influencer network"
},
"pricePerMonthWithDiscount": {
"type": "number",
"description": "The plan's monthly price after the discount"
},
"numberOfMultipleActiveCampaigns": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many campaigns may be active at once, or null when unlimited/not applicable"
},
"priorityNotificationsAndAdvertising": {
"type": "boolean",
"description": "Whether the plan includes priority notifications/ads"
}
},
"additionalProperties": false
},
"description": "The buyable plans matching the channel and currency, cheapest first"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
List the pending brand-ambassador candidates for one brand — the queue the accept/reject/remove actions work. Each candidate carries its ambassadorId (pass to accept-ambassador / reject-ambassador / remove-ambassador), the creator's ids (uuid for get-influencer, userId for the message and punishment tools), verification dates, and headline Instagram and TikTok numbers. Scope it by the brand's companyId (from list-brands — resolve the brand name to its id first, and disambiguate when more than one matches). Pass countOnly for just the count. A read; the platform gates it to a brand member with read access or an admin.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
countOnly
Return only how many candidates match, without the list — a fast 'how many' answer.
Clear enough to supply this argument.
page
Which page of candidates to return; 12 per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text filter over the candidate creator's name or handle. Omit to return every candidate.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorGroupId",
"candidates",
"companyId",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many candidates match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of candidates exist beyond this one"
},
"companyId": {
"type": "number",
"description": "The brand the queue was scoped to"
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"ambassadorId",
"influencer",
"referralCodeType",
"status",
"verifiedInstagramOn",
"verifiedTiktokOn",
"verifiedUgcOn"
],
"properties": {
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "Where the candidate stands in the brand's review; everyone in this discovery queue is still awaiting a decision"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"instagramMedianViews",
"instagramUsername",
"isVerified",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokLastPeriodVideoCount",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the message and punishment tools"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isVerified": {
"type": "boolean",
"description": "Whether the creator has passed platform verification"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"ugcVerified": {
"type": "boolean",
"description": "Whether the creator is UGC-verified"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok median views, or null"
},
"instagramMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram median views, or null"
},
"tiktokLastPeriodVideoCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos posted in the last period, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The candidate creator, or null when they have no influencer profile"
},
"ambassadorId": {
"type": "number",
"description": "The referral's id — the ambassadorId to pass to accept/reject/remove"
},
"verifiedUgcOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's UGC was verified (ISO 8601), or null"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
},
"verifiedTiktokOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's TikTok was verified (ISO 8601), or null"
},
"verifiedInstagramOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's Instagram was verified (ISO 8601), or null"
}
},
"additionalProperties": false
},
"description": "The pending ambassador candidates on this page (empty when countOnly)"
},
"ambassadorGroupId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the brand's ambassador group, or null when none exists"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-potential-ambassadors",
"title": "List a brand's potential ambassadors",
"description": "List the pending brand-ambassador candidates for one brand — the queue the accept/reject/remove actions work. Each candidate carries its ambassadorId (pass to accept-ambassador / reject-ambassador / remove-ambassador), the creator's ids (uuid for get-influencer, userId for the message and punishment tools), verification dates, and headline Instagram and TikTok numbers. Scope it by the brand's companyId (from list-brands — resolve the brand name to its id first, and disambiguate when more than one matches). Pass countOnly for just the count. A read; the platform gates it to a brand member with read access or an admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of candidates to return; 12 per page."
},
"search": {
"type": "string",
"description": "Free-text filter over the candidate creator's name or handle. Omit to return every candidate."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
},
"countOnly": {
"type": "boolean",
"default": false,
"description": "Return only how many candidates match, without the list — a fast 'how many' answer."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorGroupId",
"candidates",
"companyId",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many candidates match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of candidates exist beyond this one"
},
"companyId": {
"type": "number",
"description": "The brand the queue was scoped to"
},
"candidates": {
"type": "array",
"items": {
"type": "object",
"required": [
"ambassadorId",
"influencer",
"referralCodeType",
"status",
"verifiedInstagramOn",
"verifiedTiktokOn",
"verifiedUgcOn"
],
"properties": {
"status": {
"enum": [
"ACCEPTED",
"IMPLICIT",
"PENDING",
"REJECTED"
],
"type": "string",
"description": "Where the candidate stands in the brand's review; everyone in this discovery queue is still awaiting a decision"
},
"influencer": {
"anyOf": [
{
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"instagramMedianViews",
"instagramUsername",
"isVerified",
"name",
"profileUrl",
"tiktokEngagement",
"tiktokFollowers",
"tiktokLastPeriodVideoCount",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"uuid"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's city, or null"
},
"name": {
"type": "string",
"description": "The creator's display name"
},
"uuid": {
"type": "number",
"description": "The creator's influencer profile id, for get-influencer"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser), for the message and punishment tools"
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's country, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram follower count, or null"
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"isVerified": {
"type": "boolean",
"description": "Whether the creator has passed platform verification"
},
"profileUrl": {
"type": "string",
"description": "Deep link to the creator's influencer profile in the web app"
},
"ugcVerified": {
"type": "boolean",
"description": "Whether the creator is UGC-verified"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "TikTok handle, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok follower count, or null"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate as a percentage (e.g. 3.5 means 3.5%), or null when unknown"
},
"instagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Instagram handle, or null"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok median views, or null"
},
"instagramMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram median views, or null"
},
"tiktokLastPeriodVideoCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos posted in the last period, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The candidate creator, or null when they have no influencer profile"
},
"ambassadorId": {
"type": "number",
"description": "The referral's id — the ambassadorId to pass to accept/reject/remove"
},
"verifiedUgcOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's UGC was verified (ISO 8601), or null"
},
"referralCodeType": {
"anyOf": [
{
"enum": [
"PRIVATE",
"PUBLIC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Whether the referral came through a referral code private to one creator or a public, shareable one — or null when unknown"
},
"verifiedTiktokOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's TikTok was verified (ISO 8601), or null"
},
"verifiedInstagramOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the creator's Instagram was verified (ISO 8601), or null"
}
},
"additionalProperties": false
},
"description": "The pending ambassador candidates on this page (empty when countOnly)"
},
"ambassadorGroupId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the brand's ambassador group, or null when none exists"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
List the accepted creators in a campaign's preparation phase and their logistics state — whether their product has been sent and received, their tracking details, and their voucher. Lists the whole roster by default; pass filter to see just those still awaiting action or just those already actioned. Use it before sending tracking (set-shipment-tracking) or marking shipments (mark-all-products-sent). Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose preparation-phase creators to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filter
Which creators to list: all (everyone in preparation), pending (still awaiting action: product not sent, or no voucher yet), or completed (already actioned: product sent, or voucher assigned).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many creators to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter by creator name, Instagram handle or TikTok handle. Omit to list the whole roster.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
List the reusable reason templates (title and body in each language) staff pick from when issuing a punishment of a given type. Pass a punishmentType, or 'UNVERIFIED' to cover all three un-verify types. Use a template's id as templateId when issuing a punishment. Admin-only; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (10 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentType
Which punishment type's reason templates to list. Pass a single type, or 'UNVERIFIED' to list templates for all three un-verify types at once.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"punishmentType",
"templates"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many templates match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"templates": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"punishmentType",
"translations"
],
"properties": {
"id": {
"type": "number",
"description": "The template's id, used as templateId when issuing or editing a punishment"
},
"name": {
"type": "string",
"description": "The template's display name"
},
"translations": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"id",
"languageCode",
"title"
],
"properties": {
"id": {
"type": "number",
"description": "The translation's id, used to edit it"
},
"body": {
"type": "string",
"description": "The reason body"
},
"title": {
"type": "string",
"description": "The reason title"
},
"languageCode": {
"type": "string",
"description": "The language of this translation, e.g. EN_EN or DE_CH"
}
},
"additionalProperties": false
},
"description": "The template's per-language title/body pairs"
},
"punishmentType": {
"type": "string",
"description": "The punishment type this template's reasons apply to — a ban-family type (PERMANENT_BAN/PROBATION/TIMED_BAN) or a channel strip (UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC)"
}
},
"additionalProperties": false
},
"description": "The reason templates on this page"
},
"punishmentType": {
"type": "string",
"description": "The punishment type (or 'UNVERIFIED') that was listed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-punishment-templates",
"title": "List reason templates for a punishment type",
"description": "List the reusable reason templates (title and body in each language) staff pick from when issuing a punishment of a given type. Pass a punishmentType, or 'UNVERIFIED' to cover all three un-verify types. Use a template's id as templateId when issuing a punishment. Admin-only; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"punishmentType"
],
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return (10 per page)."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC",
"UNVERIFIED"
],
"type": "string",
"description": "Which punishment type's reason templates to list. Pass a single type, or 'UNVERIFIED' to list templates for all three un-verify types at once."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"punishmentType",
"templates"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many templates match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"templates": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"punishmentType",
"translations"
],
"properties": {
"id": {
"type": "number",
"description": "The template's id, used as templateId when issuing or editing a punishment"
},
"name": {
"type": "string",
"description": "The template's display name"
},
"translations": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"id",
"languageCode",
"title"
],
"properties": {
"id": {
"type": "number",
"description": "The translation's id, used to edit it"
},
"body": {
"type": "string",
"description": "The reason body"
},
"title": {
"type": "string",
"description": "The reason title"
},
"languageCode": {
"type": "string",
"description": "The language of this translation, e.g. EN_EN or DE_CH"
}
},
"additionalProperties": false
},
"description": "The template's per-language title/body pairs"
},
"punishmentType": {
"type": "string",
"description": "The punishment type this template's reasons apply to — a ban-family type (PERMANENT_BAN/PROBATION/TIMED_BAN) or a channel strip (UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC)"
}
},
"additionalProperties": false
},
"description": "The reason templates on this page"
},
"punishmentType": {
"type": "string",
"description": "The punishment type (or 'UNVERIFIED') that was listed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
List the punishments (discipline) on a creator's record — un-verifications and bans — active-first then newest. Pass a userId (from search-influencer-network or list-invitable-creators) to see one creator's history, or omit it to list across all creators. This is admin-only and global; no brand needs to be selected, and the platform refuses a non-admin. Each entry carries its type, status, reason, dates, who issued it and any linked campaign.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (10 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userId
The user-account (BaseUser) id of the creator whose punishment history to list — the userId field from search-influencer-network or list-invitable-creators, NOT the profile id/uuid. Omit to list punishments across all creators (admin only).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"punishments",
"userId"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many punishments match in total, across all pages"
},
"userId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator this history was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"punishments": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
"description": "The punishments on this page, active-first then newest, ordered by the platform"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-punishments",
"title": "List a creator's punishments",
"description": "List the punishments (discipline) on a creator's record — un-verifications and bans — active-first then newest. Pass a userId (from search-influencer-network or list-invitable-creators) to see one creator's history, or omit it to list across all creators. This is admin-only and global; no brand needs to be selected, and the platform refuses a non-admin. Each entry carries its type, status, reason, dates, who issued it and any linked campaign.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return (10 per page)."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The user-account (BaseUser) id of the creator whose punishment history to list — the userId field from search-influencer-network or list-invitable-creators, NOT the profile id/uuid. Omit to list punishments across all creators (admin only)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"page",
"punishments",
"userId"
],
"properties": {
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many punishments match in total, across all pages"
},
"userId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator this history was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"punishments": {
"type": "array",
"items": {
"type": "object",
"required": [
"body",
"bodyDe",
"bodyEn",
"campaignApplication",
"created",
"effectiveDate",
"expirationDate",
"givenBy",
"id",
"platform",
"reVerificationAllowed",
"status",
"templateId",
"title",
"titleDe",
"titleEn",
"type",
"typeLabel",
"userId",
"visibleForUser"
],
"properties": {
"id": {
"type": "number",
"description": "The punishment's id"
},
"body": {
"type": "string",
"description": "The reason body shown to the creator, in the caller's language (may be empty)"
},
"type": {
"type": "string",
"description": "The raw punishment type — PERMANENT_BAN, PROBATION or TIMED_BAN (the ban family), or an UN_VERIFIED_INSTAGRAM/UN_VERIFIED_TIKTOK/UN_VERIFIED_UGC channel strip; see typeLabel for the readable form"
},
"title": {
"type": "string",
"description": "The reason title shown to the creator, in the caller's language (may be empty)"
},
"bodyDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason body, or null when unset"
},
"bodyEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason body, or null when unset"
},
"status": {
"enum": [
"active",
"expired",
"inactive",
"pending"
],
"type": "string",
"description": "Derived state: active (in force and visible), pending (deferred, not yet visible), expired (its term has passed), or inactive (none of these)"
},
"userId": {
"type": "number",
"description": "The id of the creator (BaseUser) the punishment falls on"
},
"created": {
"type": "string",
"description": "When the punishment was created (ISO 8601)"
},
"givenBy": {
"type": "object",
"required": [
"firstName",
"id",
"lastName",
"profilePicture"
],
"properties": {
"id": {
"type": "number",
"description": "The issuing admin's user id"
},
"lastName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's last name, or null"
},
"firstName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's first name, or null"
},
"profilePicture": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The issuing admin's profile picture URL, or null"
}
},
"description": "The admin who issued the punishment",
"additionalProperties": false
},
"titleDe": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The German reason title, or null when unset"
},
"titleEn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The English reason title, or null when unset"
},
"platform": {
"anyOf": [
{
"enum": [
"Instagram",
"TikTok",
"UGC"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The channel an un-verify punishment applies to, or null for the ban family"
},
"typeLabel": {
"type": "string",
"description": "A human-readable label for the type"
},
"templateId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the reason template used, or null when none"
},
"effectiveDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment starts applying (ISO 8601); deferred into the future while a creator has active commitments"
},
"expirationDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the punishment ends (ISO 8601), or null when it is permanent/indefinite"
},
"visibleForUser": {
"type": "boolean",
"description": "Whether the creator can currently see the punishment"
},
"campaignApplication": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"campaignTitle",
"id"
],
"properties": {
"id": {
"type": "number",
"description": "The offending application's id"
},
"campaignId": {
"type": "number",
"description": "The id of the campaign the offending application belongs to"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null when unset"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The application this punishment was tied to, or null when it was not linked to one"
},
"reVerificationAllowed": {
"type": "boolean",
"description": "Whether the creator may re-verify after the punishment (un-verify family)"
}
},
"additionalProperties": false
},
"description": "The punishments on this page, active-first then newest, ordered by the platform"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List each accepted creator's reporting for a campaign — one row per submission, with the creator, their platform performance numbers, whether their reporting has been submitted, and their synced posts/videos each with its spark/partnership ad code and boost status. Sort by best performance, most recent, or unused ad code, and filter by reporting period or creator name. For the campaign's overall totals use get-campaign-reporting; for just the ad codes use list-ad-codes. This is also the roster of creators who have FINISHED a campaign: once a creator completes their task they leave list-applications and list-campaign-content and appear here (including before they submit their report — see taskCompleted), each with their userId — so this is how you find finished creators to message (send-message / send-bulk-message). Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose per-submission reporting to list.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
date
Optional reporting period as YYYY-MM-DD (from get-campaign-reporting's availableDates) to filter to.
Clear enough to supply this argument.
limit
How many submissions to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
How to sort: best (highest-performing first), recent (most recently reported first), or unused_ad_code (submissions whose spark/partnership code has not been boosted yet first).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Filter by creator name, Instagram handle or TikTok handle. Omit to include every submission.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List the review tickets that back the admin hub — the items campaign automations raise for staff. Filter by kind to get the action queue (ACTION_REQUIRED, the work waiting on a decision) or the activity log (INFORMATIONAL, the read-only audit trail), by status (the queue is OPEN), by ticket type, and by free-text search; order by deadline for the queue's soonest-due-first urgency. Each ticket carries its summary, the campaign and creator it concerns, its content deadline, and the ids that route its action to the right tool (complete-task, respond-to-campaign-request, issue-punishment, or the chat tools). Admin-only and global — no brand is selected, and the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Filter to the action queue (ACTION_REQUIRED — tickets needing a decision) or the activity log (INFORMATIONAL — automation audit trail). Omit for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ordering
Sort order. 'deadline' is soonest-due first (the action queue's urgency sort, tickets without a deadline last); '-created' is newest first. Omit to default to newest first.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return (12 per page).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
search
Free-text filter over the summary, campaign title/brand, and the creator's name or handle. Omit for all tickets.
Clear enough to supply this argument.
status
Filter by status; omit for all. The action queue is the OPEN, ACTION_REQUIRED tickets.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ticketTypes
Filter to specific automation types, e.g. warning_overdue, stories_missing, brand_cancellation_request, deadline_reminder_2d, ad_code_missing. Omit for all types.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"kind",
"page",
"status",
"tickets",
"ticketTypes"
],
"properties": {
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The kind the list was filtered to, or null when unfiltered"
},
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many tickets match in total, across all pages"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"tickets": {
"type": "array",
"items": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"additionalProperties": false
},
"description": "The tickets on this page, in the requested order"
},
"ticketTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "The ticket types the list was filtered to, empty when unfiltered"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-review-tickets",
"title": "List admin hub review tickets",
"description": "List the review tickets that back the admin hub — the items campaign automations raise for staff. Filter by kind to get the action queue (ACTION_REQUIRED, the work waiting on a decision) or the activity log (INFORMATIONAL, the read-only audit trail), by status (the queue is OPEN), by ticket type, and by free-text search; order by deadline for the queue's soonest-due-first urgency. Each ticket carries its summary, the campaign and creator it concerns, its content deadline, and the ids that route its action to the right tool (complete-task, respond-to-campaign-request, issue-punishment, or the chat tools). Admin-only and global — no brand is selected, and the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "Filter to the action queue (ACTION_REQUIRED — tickets needing a decision) or the activity log (INFORMATIONAL — automation audit trail). Omit for both."
},
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return (12 per page)."
},
"search": {
"type": "string",
"description": "Free-text filter over the summary, campaign title/brand, and the creator's name or handle. Omit for all tickets."
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Filter by status; omit for all. The action queue is the OPEN, ACTION_REQUIRED tickets."
},
"ordering": {
"enum": [
"-created",
"-deadline",
"created",
"deadline"
],
"type": "string",
"description": "Sort order. 'deadline' is soonest-due first (the action queue's urgency sort, tickets without a deadline last); '-created' is newest first. Omit to default to newest first."
},
"ticketTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "Filter to specific automation types, e.g. warning_overdue, stories_missing, brand_cancellation_request, deadline_reminder_2d, ad_code_missing. Omit for all types."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hasMore",
"kind",
"page",
"status",
"tickets",
"ticketTypes"
],
"properties": {
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The kind the list was filtered to, or null when unfiltered"
},
"page": {
"type": "number",
"description": "The page that was returned"
},
"count": {
"type": "number",
"description": "How many tickets match in total, across all pages"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The status the list was filtered to, or null when unfiltered"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"tickets": {
"type": "array",
"items": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"additionalProperties": false
},
"description": "The tickets on this page, in the requested order"
},
"ticketTypes": {
"type": "array",
"items": {
"type": "string"
},
"description": "The ticket types the list was filtered to, empty when unfiltered"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
List the team's shared, saved creator-sourcing runs from the standalone sourcing tool (sourcing.refluenced.com), newest first. Each entry carries the run's name, channel, targeted markets, creator count, author, and folder — the metadata only, not the creators themselves; load one with get-sourcing-project to see its scored creator list. Optionally filter by channel or by a name/author substring. A read — no brand is selected, and it does not spend. This reaches a separate service with its own credentials, so an auth error means the sourcing cookie is missing or expired, not that you lack a permission.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Filter to runs sourced on one channel. Omit to list runs across every channel.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Case-insensitive substring to match against a run's name or its author's email. Omit for all runs.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"dbEnabled",
"projects"
],
"properties": {
"count": {
"type": "number",
"description": "How many runs were returned"
},
"projects": {
"type": "array",
"items": {
"type": "object",
"required": [
"author",
"createdAt",
"creatorCount",
"folderId",
"folderName",
"id",
"markets",
"name",
"platform"
],
"properties": {
"id": {
"type": "number",
"description": "The run's id, passed to get-sourcing-project to load its full creator list"
},
"name": {
"type": "string",
"description": "The run's name"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The email of the staff member who created the run, or null"
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets (countries) the run targeted"
},
"folderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the folder the run sits in, or null when unfiled"
},
"platform": {
"type": "string",
"description": "The channel the run sourced: instagram or tiktok"
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the run was created (ISO 8601), or null"
},
"folderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of that folder, or null when unfiled"
},
"creatorCount": {
"type": "number",
"description": "How many creators the run holds — load the run to see them"
}
},
"additionalProperties": false
},
"description": "The team's saved sourcing runs, newest first"
},
"dbEnabled": {
"type": "boolean",
"description": "Whether the sourcing tool has a shared database — false means there are no shared runs"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-sourcing-projects",
"title": "List sourcing runs",
"description": "List the team's shared, saved creator-sourcing runs from the standalone sourcing tool (sourcing.refluenced.com), newest first. Each entry carries the run's name, channel, targeted markets, creator count, author, and folder — the metadata only, not the creators themselves; load one with get-sourcing-project to see its scored creator list. Optionally filter by channel or by a name/author substring. A read — no brand is selected, and it does not spend. This reaches a separate service with its own credentials, so an auth error means the sourcing cookie is missing or expired, not that you lack a permission.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"query": {
"type": "string",
"description": "Case-insensitive substring to match against a run's name or its author's email. Omit for all runs."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Filter to runs sourced on one channel. Omit to list runs across every channel."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"dbEnabled",
"projects"
],
"properties": {
"count": {
"type": "number",
"description": "How many runs were returned"
},
"projects": {
"type": "array",
"items": {
"type": "object",
"required": [
"author",
"createdAt",
"creatorCount",
"folderId",
"folderName",
"id",
"markets",
"name",
"platform"
],
"properties": {
"id": {
"type": "number",
"description": "The run's id, passed to get-sourcing-project to load its full creator list"
},
"name": {
"type": "string",
"description": "The run's name"
},
"author": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The email of the staff member who created the run, or null"
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets (countries) the run targeted"
},
"folderId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the folder the run sits in, or null when unfiled"
},
"platform": {
"type": "string",
"description": "The channel the run sourced: instagram or tiktok"
},
"createdAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the run was created (ISO 8601), or null"
},
"folderName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of that folder, or null when unfiled"
},
"creatorCount": {
"type": "number",
"description": "How many creators the run holds — load the run to see them"
}
},
"additionalProperties": false
},
"description": "The team's saved sourcing runs, newest first"
},
"dbEnabled": {
"type": "boolean",
"description": "Whether the sourcing tool has a shared database — false means there are no shared runs"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
The public TikTok-visibility leaderboard — brands ranked by their overall visibility score, one row per domain (its best report), with each brand's top keyword, category, and best-performing video, plus the total number of scans and the most recent ones. Optionally restrict to a date range with from/to; defaults to today. Chart the ranking by calling the render-chart tool — never the client's own default chart card, so it keeps Refluenced's brand palette. Names no brand.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
from
Start of the date range to rank over, ISO date or datetime. Defaults to the start of today (UTC).
Clear enough to supply this argument.
to
End of the date range to rank over, ISO date or datetime. Defaults to now.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brands",
"recentScans",
"totalScans"
],
"properties": {
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"category",
"domain",
"lastScanAt",
"logoUrl",
"name",
"rank",
"region",
"score",
"topKeyword",
"topVideo"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is known"
},
"rank": {
"type": "number",
"description": "The brand's rank on the leaderboard (1 = highest visibility)"
},
"score": {
"type": "number",
"description": "The brand's overall visibility score (0-100)"
},
"domain": {
"type": "string",
"description": "The brand's website domain (www. stripped)"
},
"region": {
"type": "string",
"description": "The market the brand's report was run for"
},
"logoUrl": {
"type": "string",
"description": "A logo image URL for the brand"
},
"category": {
"type": "string",
"description": "The brand's primary product-line category, or empty"
},
"topVideo": {
"anyOf": [
{
"type": "object",
"required": [
"coverUrl",
"creator",
"videoUrl",
"views"
],
"properties": {
"views": {
"type": "number",
"description": "The video's view count"
},
"creator": {
"type": "string",
"description": "The video's creator handle, e.g. @name"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, or empty"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's best-performing video for its top keyword, or null"
},
"lastScanAt": {
"type": "string",
"description": "When this brand's best report was created (ISO 8601)"
},
"topKeyword": {
"type": "string",
"description": "The keyword the brand scores highest on, or empty"
}
},
"additionalProperties": false
},
"description": "Brands ranked by overall visibility score, highest first"
},
"totalScans": {
"type": "number",
"description": "How many reports were run in the range"
},
"recentScans": {
"type": "array",
"items": {
"type": "object",
"required": [
"brandName",
"scannedAt"
],
"properties": {
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scanned brand's name, or null"
},
"scannedAt": {
"type": "string",
"description": "When it was scanned (ISO 8601)"
}
},
"additionalProperties": false
},
"description": "The five most recent scans in the range"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-tiktok-leaderboard",
"title": "TikTok visibility leaderboard",
"description": "The public TikTok-visibility leaderboard — brands ranked by their overall visibility score, one row per domain (its best report), with each brand's top keyword, category, and best-performing video, plus the total number of scans and the most recent ones. Optionally restrict to a date range with from/to; defaults to today. Chart the ranking by calling the render-chart tool — never the client's own default chart card, so it keeps Refluenced's brand palette. Names no brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"to": {
"type": "string",
"description": "End of the date range to rank over, ISO date or datetime. Defaults to now."
},
"from": {
"type": "string",
"description": "Start of the date range to rank over, ISO date or datetime. Defaults to the start of today (UTC)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brands",
"recentScans",
"totalScans"
],
"properties": {
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"category",
"domain",
"lastScanAt",
"logoUrl",
"name",
"rank",
"region",
"score",
"topKeyword",
"topVideo"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is known"
},
"rank": {
"type": "number",
"description": "The brand's rank on the leaderboard (1 = highest visibility)"
},
"score": {
"type": "number",
"description": "The brand's overall visibility score (0-100)"
},
"domain": {
"type": "string",
"description": "The brand's website domain (www. stripped)"
},
"region": {
"type": "string",
"description": "The market the brand's report was run for"
},
"logoUrl": {
"type": "string",
"description": "A logo image URL for the brand"
},
"category": {
"type": "string",
"description": "The brand's primary product-line category, or empty"
},
"topVideo": {
"anyOf": [
{
"type": "object",
"required": [
"coverUrl",
"creator",
"videoUrl",
"views"
],
"properties": {
"views": {
"type": "number",
"description": "The video's view count"
},
"creator": {
"type": "string",
"description": "The video's creator handle, e.g. @name"
},
"coverUrl": {
"type": "string",
"description": "Thumbnail URL for the video, or empty"
},
"videoUrl": {
"type": "string",
"description": "Link to the TikTok video"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand's best-performing video for its top keyword, or null"
},
"lastScanAt": {
"type": "string",
"description": "When this brand's best report was created (ISO 8601)"
},
"topKeyword": {
"type": "string",
"description": "The keyword the brand scores highest on, or empty"
}
},
"additionalProperties": false
},
"description": "Brands ranked by overall visibility score, highest first"
},
"totalScans": {
"type": "number",
"description": "How many reports were run in the range"
},
"recentScans": {
"type": "array",
"items": {
"type": "object",
"required": [
"brandName",
"scannedAt"
],
"properties": {
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scanned brand's name, or null"
},
"scannedAt": {
"type": "string",
"description": "When it was scanned (ISO 8601)"
}
},
"additionalProperties": false
},
"description": "The five most recent scans in the range"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List the video briefs on a UGC campaign and the creator's submission for each — whether a video is in review, approved, pending a revision, or not yet submitted, with a link to the video and how many revisions remain. Use it before approving or requesting a revision with review-ugc-media. Pass the applicationId from list-campaign-content; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the UGC application whose submitted videos to list, from list-campaign-content.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"mediaUrl",
"name",
"revisionReason",
"revisionsRemaining",
"status",
"ugcContentId"
],
"properties": {
"name": {
"type": "string",
"description": "The video brief's name"
},
"status": {
"type": "string",
"description": "The video's state: 'approved', 'in review', 'pending revision', or 'not submitted'"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A direct link to the creator's submitted video, or null if none yet"
},
"ugcContentId": {
"type": "number",
"description": "The video brief's id, passed to review-ugc-media as the ugcContentId"
},
"revisionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason given the last time a revision was requested, or null"
},
"revisionsRemaining": {
"type": "number",
"description": "How many revision requests remain for this video"
}
},
"additionalProperties": false
},
"description": "The campaign's video briefs and the creator's submission state for each"
},
"applicationId": {
"type": "number",
"description": "The application these videos belong to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-ugc-media",
"title": "List a creator's submitted UGC videos",
"description": "List the video briefs on a UGC campaign and the creator's submission for each — whether a video is in review, approved, pending a revision, or not yet submitted, with a link to the video and how many revisions remain. Use it before approving or requesting a revision with review-ugc-media. Pass the applicationId from list-campaign-content; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC application whose submitted videos to list, from list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"mediaUrl",
"name",
"revisionReason",
"revisionsRemaining",
"status",
"ugcContentId"
],
"properties": {
"name": {
"type": "string",
"description": "The video brief's name"
},
"status": {
"type": "string",
"description": "The video's state: 'approved', 'in review', 'pending revision', or 'not submitted'"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A direct link to the creator's submitted video, or null if none yet"
},
"ugcContentId": {
"type": "number",
"description": "The video brief's id, passed to review-ugc-media as the ugcContentId"
},
"revisionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason given the last time a revision was requested, or null"
},
"revisionsRemaining": {
"type": "number",
"description": "How many revision requests remain for this video"
}
},
"additionalProperties": false
},
"description": "The campaign's video briefs and the creator's submission state for each"
},
"applicationId": {
"type": "number",
"description": "The application these videos belong to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
List a creator's submitted UGC verification videos together with the platform's advisory AI rubric evaluation — the recommendation (APPROVE/REJECT), per-check pass/fail with reasons, and a suggested rejection reason — the influencer edit page's UGC verification panel. Each verification carries its id, to pass to review-ugc-verification to accept or reject it. Keyed by the influencer profile id (the uuid). Admin-only: the platform returns these only to an administrator and an empty list to everyone else. Distinct from review-ugc-media, which reviews a campaign's UGC content.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
influencerId
The creator's influencer profile id, from get-influencer or search-influencer-network.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creatorName",
"influencerId",
"userId",
"verifications"
],
"properties": {
"userId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser), or null"
},
"creatorName": {
"type": "string",
"description": "The creator the verifications belong to"
},
"influencerId": {
"type": "number",
"description": "The creator's influencer profile id"
},
"verifications": {
"type": "array",
"items": {
"type": "object",
"required": [
"aiEvaluation",
"autoRejected",
"created",
"id",
"lengthSeconds",
"mediaUrl",
"modified",
"rejectionReason",
"status",
"thumbnailUrl",
"userId"
],
"properties": {
"id": {
"type": "number",
"description": "The UGC verification id — pass to review-ugc-verification to accept or reject it"
},
"status": {
"enum": [
"accepted",
"pending",
"rejected"
],
"type": "string",
"description": "The verification's status — only a pending one can be accepted or rejected"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser) who submitted the verification"
},
"created": {
"type": "string",
"description": "When the verification was submitted (ISO 8601)"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the verification video, or null"
},
"modified": {
"type": "string",
"description": "When the verification was last changed (ISO 8601)"
},
"aiEvaluation": {
"type": "object",
"required": [
"checks",
"detail",
"recommendation",
"rubricVersion",
"status",
"suggestedReason"
],
"properties": {
"checks": {
"type": "array",
"items": {
"type": "object",
"required": [
"confidence",
"id",
"passed",
"reason"
],
"properties": {
"id": {
"type": "string",
"description": "The check's id, e.g. not_ai_voice, brand_safety_ok, strong_hook"
},
"passed": {
"type": "boolean",
"description": "Whether the check passed"
},
"reason": {
"type": "string",
"description": "The AI's reasoning, in the reviewer's language"
},
"confidence": {
"type": "number",
"description": "The AI's confidence in this check, 0–1"
}
},
"additionalProperties": false
},
"description": "The per-check results — populated only when status is succeeded, otherwise empty"
},
"detail": {
"type": "string",
"description": "A short detail code from the evaluation"
},
"status": {
"enum": [
"failed",
"not_started",
"running",
"skipped",
"succeeded"
],
"type": "string",
"description": "The AI evaluation's state; checks and recommendation are present only when succeeded"
},
"rubricVersion": {
"type": "string",
"description": "The rubric version the evaluation used"
},
"recommendation": {
"enum": [
"",
"APPROVE",
"REJECT"
],
"type": "string",
"description": "The AI's advisory recommendation (empty until the evaluation succeeds) — it never acts on its own"
},
"suggestedReason": {
"type": "string",
"description": "Suggested rejection copy in the creator's language, or empty"
}
},
"description": "The advisory AI rubric evaluation attached to the verification",
"additionalProperties": false
},
"autoRejected": {
"type": "boolean",
"description": "Whether the AI auto-rejected this verification"
},
"thumbnailUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the video thumbnail, or null"
},
"lengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The video's length in seconds, or null"
},
"rejectionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason the verification was rejected, or null"
}
},
"additionalProperties": false
},
"description": "The creator's UGC verification videos, each with its advisory AI rubric evaluation"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-ugc-verifications",
"title": "List a creator's UGC verifications",
"description": "List a creator's submitted UGC verification videos together with the platform's advisory AI rubric evaluation — the recommendation (APPROVE/REJECT), per-check pass/fail with reasons, and a suggested rejection reason — the influencer edit page's UGC verification panel. Each verification carries its id, to pass to review-ugc-verification to accept or reject it. Keyed by the influencer profile id (the uuid). Admin-only: the platform returns these only to an administrator and an empty list to everyone else. Distinct from review-ugc-media, which reviews a campaign's UGC content.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId"
],
"properties": {
"influencerId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's influencer profile id, from get-influencer or search-influencer-network."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creatorName",
"influencerId",
"userId",
"verifications"
],
"properties": {
"userId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser), or null"
},
"creatorName": {
"type": "string",
"description": "The creator the verifications belong to"
},
"influencerId": {
"type": "number",
"description": "The creator's influencer profile id"
},
"verifications": {
"type": "array",
"items": {
"type": "object",
"required": [
"aiEvaluation",
"autoRejected",
"created",
"id",
"lengthSeconds",
"mediaUrl",
"modified",
"rejectionReason",
"status",
"thumbnailUrl",
"userId"
],
"properties": {
"id": {
"type": "number",
"description": "The UGC verification id — pass to review-ugc-verification to accept or reject it"
},
"status": {
"enum": [
"accepted",
"pending",
"rejected"
],
"type": "string",
"description": "The verification's status — only a pending one can be accepted or rejected"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser) who submitted the verification"
},
"created": {
"type": "string",
"description": "When the verification was submitted (ISO 8601)"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the verification video, or null"
},
"modified": {
"type": "string",
"description": "When the verification was last changed (ISO 8601)"
},
"aiEvaluation": {
"type": "object",
"required": [
"checks",
"detail",
"recommendation",
"rubricVersion",
"status",
"suggestedReason"
],
"properties": {
"checks": {
"type": "array",
"items": {
"type": "object",
"required": [
"confidence",
"id",
"passed",
"reason"
],
"properties": {
"id": {
"type": "string",
"description": "The check's id, e.g. not_ai_voice, brand_safety_ok, strong_hook"
},
"passed": {
"type": "boolean",
"description": "Whether the check passed"
},
"reason": {
"type": "string",
"description": "The AI's reasoning, in the reviewer's language"
},
"confidence": {
"type": "number",
"description": "The AI's confidence in this check, 0–1"
}
},
"additionalProperties": false
},
"description": "The per-check results — populated only when status is succeeded, otherwise empty"
},
"detail": {
"type": "string",
"description": "A short detail code from the evaluation"
},
"status": {
"enum": [
"failed",
"not_started",
"running",
"skipped",
"succeeded"
],
"type": "string",
"description": "The AI evaluation's state; checks and recommendation are present only when succeeded"
},
"rubricVersion": {
"type": "string",
"description": "The rubric version the evaluation used"
},
"recommendation": {
"enum": [
"",
"APPROVE",
"REJECT"
],
"type": "string",
"description": "The AI's advisory recommendation (empty until the evaluation succeeds) — it never acts on its own"
},
"suggestedReason": {
"type": "string",
"description": "Suggested rejection copy in the creator's language, or empty"
}
},
"description": "The advisory AI rubric evaluation attached to the verification",
"additionalProperties": false
},
"autoRejected": {
"type": "boolean",
"description": "Whether the AI auto-rejected this verification"
},
"thumbnailUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the video thumbnail, or null"
},
"lengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The video's length in seconds, or null"
},
"rejectionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason the verification was rejected, or null"
}
},
"additionalProperties": false
},
"description": "The creator's UGC verification videos, each with its advisory AI rubric evaluation"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List the video briefs of a UGC campaign — each video's id, name, length and scene instructions. Pass the campaignId; no brand needs to be selected. Use the ids here to edit or remove a video (edit-ugc-video, remove-ugc-video). A campaign that is not a UGC campaign has no videos and returns an empty list.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the UGC campaign whose videos to list, from list-campaigns, search-campaigns or get-campaign.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
"description": "The campaign's UGC video briefs, each with its scenes."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "list-ugc-videos",
"title": "List a UGC campaign's videos",
"description": "List the video briefs of a UGC campaign — each video's id, name, length and scene instructions. Pass the campaignId; no brand needs to be selected. Use the ids here to edit or remove a video (edit-ugc-video, remove-ugc-video). A campaign that is not a UGC campaign has no videos and returns an empty list.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC campaign whose videos to list, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"videos"
],
"properties": {
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"length",
"name",
"scenes"
],
"properties": {
"id": {
"type": "number",
"description": "The video's id, used to edit or remove it."
},
"name": {
"type": "string",
"description": "The video's name, e.g. \"Video 1\"."
},
"length": {
"type": "number",
"description": "The video's length in seconds (15 or 30)."
},
"scenes": {
"type": "array",
"items": {
"type": "object",
"required": [
"content",
"name",
"placeholder"
],
"properties": {
"name": {
"type": "string",
"description": "The scene's stable name."
},
"content": {
"type": "string",
"description": "The authored instruction for this scene, empty when not yet filled in."
},
"placeholder": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The scene's guidance placeholder, or null."
}
},
"additionalProperties": false
},
"description": "The video's brief scenes, in order."
}
},
"additionalProperties": false
},
"description": "The campaign's UGC video briefs, each with its scenes."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Mark every not-yet-sent product on a physical-product campaign as shipped in one step — an outward-facing change the creators see, so it is preview-then-confirm and the preview names the brand and how many shipments it covers. The platform only allows this on a physical-product campaign (not_physical_product_campaign is surfaced as-is). Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the physical-product campaign whose shipments to mark as sent.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"markedCount",
"pendingCount",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the shipments were marked (true) or this is a preview only (false)."
},
"campaignId": {
"type": "number",
"description": "The campaign whose shipments were marked"
},
"markedCount": {
"type": "number",
"description": "How many shipments were marked as sent — always 0 on a preview, since nothing is done yet."
},
"pendingCount": {
"type": "number",
"description": "How many unsent products the action covers — the impact shown on the preview; 0 once all are marked."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "mark-all-products-sent",
"title": "Mark all of a campaign's products as sent",
"description": "Mark every not-yet-sent product on a physical-product campaign as shipped in one step — an outward-facing change the creators see, so it is preview-then-confirm and the preview names the brand and how many shipments it covers. The platform only allows this on a physical-product campaign (not_physical_product_campaign is surfaced as-is). Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the physical-product campaign whose shipments to mark as sent."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"markedCount",
"pendingCount",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the shipments were marked (true) or this is a preview only (false)."
},
"campaignId": {
"type": "number",
"description": "The campaign whose shipments were marked"
},
"markedCount": {
"type": "number",
"description": "How many shipments were marked as sent — always 0 on a preview, since nothing is done yet."
},
"pendingCount": {
"type": "number",
"description": "How many unsent products the action covers — the impact shown on the preview; 0 once all are marked."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Accept, decline, or reopen campaign applications. Pass the applicationIds from list-applications — one, or a whole filtered selection to move at once. Accepting or declining is reversible: reopen moves an application back to pending. This mirrors the one-click action in the web app, so it applies directly without a separate confirmation. Targets applications by id; no brand needs to be selected. Any that cannot be moved are reported rather than hidden.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
What to do: accept the application, decline it, or reopen it (move an accepted or declined application back to pending).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationIds
The applications to move, from list-applications. Pass several to move a whole selection at once.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"failed",
"moved",
"performed",
"requested"
],
"properties": {
"moved": {
"type": "array",
"items": {
"type": "number"
},
"description": "The ids of the applications that were moved"
},
"action": {
"type": "string",
"description": "The action that was applied"
},
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this one"
},
"applicationId": {
"type": "number",
"description": "The application that could not be moved"
}
},
"additionalProperties": false
},
"description": "Any applications that could not be moved, reported rather than hidden"
},
"performed": {
"type": "boolean",
"description": "Whether any application was moved — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many applications the request asked to move"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "move-application",
"title": "Move applications",
"description": "Accept, decline, or reopen campaign applications. Pass the applicationIds from list-applications — one, or a whole filtered selection to move at once. Accepting or declining is reversible: reopen moves an application back to pending. This mirrors the one-click action in the web app, so it applies directly without a separate confirmation. Targets applications by id; no brand needs to be selected. Any that cannot be moved are reported rather than hidden.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"applicationIds"
],
"properties": {
"action": {
"enum": [
"accept",
"decline",
"reopen"
],
"type": "string",
"description": "What to do: accept the application, decline it, or reopen it (move an accepted or declined application back to pending)."
},
"applicationIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"maxItems": 100,
"minItems": 1,
"description": "The applications to move, from list-applications. Pass several to move a whole selection at once."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"failed",
"moved",
"performed",
"requested"
],
"properties": {
"moved": {
"type": "array",
"items": {
"type": "number"
},
"description": "The ids of the applications that were moved"
},
"action": {
"type": "string",
"description": "The action that was applied"
},
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"applicationId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why the platform refused this one"
},
"applicationId": {
"type": "number",
"description": "The application that could not be moved"
}
},
"additionalProperties": false
},
"description": "Any applications that could not be moved, reported rather than hidden"
},
"performed": {
"type": "boolean",
"description": "Whether any application was moved — always true; this tool writes directly"
},
"requested": {
"type": "number",
"description": "How many applications the request asked to move"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Pause an ongoing campaign so it stops appearing to new creators until it is resumed — an outward-facing change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Only ongoing campaigns can be paused; a campaign that is already paused is refused. Resume it later with resume-campaign. The platform enforces the rest; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the ongoing campaign to pause, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "pause-campaign",
"title": "Pause an ongoing campaign",
"description": "Pause an ongoing campaign so it stops appearing to new creators until it is resumed — an outward-facing change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Only ongoing campaigns can be paused; a campaign that is already paused is refused. Resume it later with resume-campaign. The platform enforces the rest; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the ongoing campaign to pause, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Pay out the speedy reward — the bonus-pool bonus for fast delivery — to a creator. It moves money and cannot be undone, so it is preview-then-confirm and the preview names the brand. The platform restricts this to Refluenced staff and to bonus-pool campaigns, and returns its refusals (speedy_reward_already_paid, campaign_has_no_bonus_pool, influencer_not_found) as-is. Target it by applicationId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application to pay the speedy reward on, from list-applications or list-campaign-content.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the payout was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application whose speedy reward was paid out"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "payout-speedy-reward",
"title": "Pay out a creator's speedy reward",
"description": "Pay out the speedy reward — the bonus-pool bonus for fast delivery — to a creator. It moves money and cannot be undone, so it is preview-then-confirm and the preview names the brand. The platform restricts this to Refluenced staff and to bonus-pool campaigns, and returns its refusals (speedy_reward_already_paid, campaign_has_no_bonus_pool, influencer_not_found) as-is. Target it by applicationId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application to pay the speedy reward on, from list-applications or list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the payout was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application whose speedy reward was paid out"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Publish a draft campaign so it goes live — this is the outward-facing step that takes a campaign out of draft, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Refuses a campaign that is already published, and refuses one that is not ready — listing every required field still missing (title, product description, campaign image, location, task, deliverables, reward, casting start, deadline and completion date) so they can be filled in with edit-campaign first. Admins (Refluenced staff) are an exception: instead of a refusal they get a confirmation naming the missing fields and may publish anyway — except a missing casting start, which blocks everyone. The platform enforces the rest (active subscription, plan and campaign limits); any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the draft campaign to publish, from list-campaigns, search-campaigns or get-campaign.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "publish-campaign",
"title": "Publish a draft campaign",
"description": "Publish a draft campaign so it goes live — this is the outward-facing step that takes a campaign out of draft, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Refuses a campaign that is already published, and refuses one that is not ready — listing every required field still missing (title, product description, campaign image, location, task, deliverables, reward, casting start, deadline and completion date) so they can be filled in with edit-campaign first. Admins (Refluenced staff) are an exception: instead of a refusal they get a confirmation naming the missing fields and may publish anyway — except a missing casting start, which blocks everyone. The platform enforces the rest (active subscription, plan and campaign limits); any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the draft campaign to publish, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
Shorten the title to an action and subject; move usage details into the description.
Description99/100
Publish several draft campaigns in one request, taking them out of draft so they go live. Pass the campaign ids (from list-campaigns or search-campaigns); the count is capped for safety. This is the outward-facing step, so it is preview-then-confirm: by default it fetches each campaign, names the brand(s) involved, and shows which will publish and which are blocked — already live, or not ready with required fields still missing — for you to confirm with the user. Call again with confirm: true to publish the eligible ones. A campaign that is not ready is skipped, not published; fill its missing fields with edit-campaign first. For admins (Refluenced staff), a not-ready campaign is not skipped but published under the same confirmation, its missing fields named — except a missing casting start, which blocks it for everyone. Every published id and url is returned, and every skipped or refused campaign is reported explicitly rather than hidden behind a clean success.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignIds
The ids of the draft campaigns to publish, from list-campaigns or search-campaigns — at most 20 per request.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"failed",
"performed",
"published",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"reason"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign id that was not published"
},
"reason": {
"type": "string",
"description": "Why it was not published — already live, no casting start, or a platform refusal"
}
},
"additionalProperties": false
},
"description": "Every campaign that was not published, reported rather than hidden"
},
"performed": {
"type": "boolean",
"description": "Whether the batch was actually published (true) or this is a preview only (false)"
},
"published": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The published campaign's id"
},
"url": {
"type": "string",
"description": "The published campaign's page in the Refluenced web app"
},
"title": {
"type": "string",
"description": "The published campaign's title"
}
},
"additionalProperties": false
},
"description": "Every campaign that was published, with its id and web url"
},
"requested": {
"type": "number",
"description": "How many campaigns the request asked to publish"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "publish-campaigns",
"title": "Publish several draft campaigns at once",
"description": "Publish several draft campaigns in one request, taking them out of draft so they go live. Pass the campaign ids (from list-campaigns or search-campaigns); the count is capped for safety. This is the outward-facing step, so it is preview-then-confirm: by default it fetches each campaign, names the brand(s) involved, and shows which will publish and which are blocked — already live, or not ready with required fields still missing — for you to confirm with the user. Call again with confirm: true to publish the eligible ones. A campaign that is not ready is skipped, not published; fill its missing fields with edit-campaign first. For admins (Refluenced staff), a not-ready campaign is not skipped but published under the same confirmation, its missing fields named — except a missing casting start, which blocks it for everyone. Every published id and url is returned, and every skipped or refused campaign is reported explicitly rather than hidden behind a clean success.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignIds"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"minItems": 1,
"description": "The ids of the draft campaigns to publish, from list-campaigns or search-campaigns — at most 20 per request."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"failed",
"performed",
"published",
"requested"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"reason"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign id that was not published"
},
"reason": {
"type": "string",
"description": "Why it was not published — already live, no casting start, or a platform refusal"
}
},
"additionalProperties": false
},
"description": "Every campaign that was not published, reported rather than hidden"
},
"performed": {
"type": "boolean",
"description": "Whether the batch was actually published (true) or this is a preview only (false)"
},
"published": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The published campaign's id"
},
"url": {
"type": "string",
"description": "The published campaign's page in the Refluenced web app"
},
"title": {
"type": "string",
"description": "The published campaign's title"
}
},
"additionalProperties": false
},
"description": "Every campaign that was published, with its id and web url"
},
"requested": {
"type": "number",
"description": "How many campaigns the request asked to publish"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Purchase a subscription plan for your own agency through Stripe — the brand-side /plans/ flow. Pass a packageId (from list-plans) and the billing period; it creates a pending subscription and returns a hosted Stripe Checkout link to open in a browser. Preview-then-confirm, because it is a real, irreversible charge: with confirm false it states what will be purchased, with the plan's recurring price so you can show the cost, and does nothing. Nothing is charged until payment is completed on Stripe's page, and the subscription activates when Stripe confirms. This acts on the caller's own agency (a brand user) — the platform refuses a non-brand caller (only_brands_can_subscribe), an agency that already has an active or planned subscription, or an account on an admin-managed (invoice) plan (admin_assigned_subscription_exists). To assign a plan to another agency as an admin, use assign-subscription instead.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
cancelUrl
Where Stripe returns the user if they cancel. Defaults to the plans page.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
packageId
The plan to purchase, from list-plans.
Clear enough to supply this argument.
packageType
The billing period the subscription is charged on; the recurring price shown is per this period. Longer billing periods exist platform-side but are admin-only.
Clear enough to supply this argument.
successUrl
Where Stripe returns the user after a successful payment. Defaults to the plans page.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"checkoutUrl",
"performed",
"subscription",
"targetPlan"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the checkout was started (true) or this is a preview only (false)."
},
"targetPlan": {
"anyOf": [
{
"type": "object",
"required": [
"currency",
"discountPercentage",
"id",
"name",
"recurringPrice",
"recurringPriceListed"
],
"properties": {
"id": {
"type": "number",
"description": "The target plan's id"
},
"name": {
"type": "string",
"description": "The target plan's name, e.g. EXPERT"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"recurringPrice": {
"type": "number",
"description": "The recurring price for the chosen billing period, after any discount — what is billed each period"
},
"discountPercentage": {
"type": "number",
"description": "The discount applied to the plan's list price, 0 when none"
},
"recurringPriceListed": {
"type": "number",
"description": "The plan's list price for the chosen billing period, before any discount"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "On a preview, the plan and its recurring price so the cost can be shown; null once the checkout is started."
},
"checkoutUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The hosted Stripe Checkout link to open in a browser, or null for a preview / if none was returned."
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The pending subscription created for the checkout, or null for a preview."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "purchase-plan",
"title": "Purchase a subscription plan",
"description": "Purchase a subscription plan for your own agency through Stripe — the brand-side /plans/ flow. Pass a packageId (from list-plans) and the billing period; it creates a pending subscription and returns a hosted Stripe Checkout link to open in a browser. Preview-then-confirm, because it is a real, irreversible charge: with confirm false it states what will be purchased, with the plan's recurring price so you can show the cost, and does nothing. Nothing is charged until payment is completed on Stripe's page, and the subscription activates when Stripe confirms. This acts on the caller's own agency (a brand user) — the platform refuses a non-brand caller (only_brands_can_subscribe), an agency that already has an active or planned subscription, or an account on an admin-managed (invoice) plan (admin_assigned_subscription_exists). To assign a plan to another agency as an admin, use assign-subscription instead.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"packageId",
"packageType"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"cancelUrl": {
"type": "string",
"description": "Where Stripe returns the user if they cancel. Defaults to the plans page."
},
"packageId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The plan to purchase, from list-plans."
},
"successUrl": {
"type": "string",
"description": "Where Stripe returns the user after a successful payment. Defaults to the plans page."
},
"packageType": {
"enum": [
"MONTHLY",
"YEARLY"
],
"type": "string",
"description": "The billing period the subscription is charged on; the recurring price shown is per this period. Longer billing periods exist platform-side but are admin-only."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"checkoutUrl",
"performed",
"subscription",
"targetPlan"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the checkout was started (true) or this is a preview only (false)."
},
"targetPlan": {
"anyOf": [
{
"type": "object",
"required": [
"currency",
"discountPercentage",
"id",
"name",
"recurringPrice",
"recurringPriceListed"
],
"properties": {
"id": {
"type": "number",
"description": "The target plan's id"
},
"name": {
"type": "string",
"description": "The target plan's name, e.g. EXPERT"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"recurringPrice": {
"type": "number",
"description": "The recurring price for the chosen billing period, after any discount — what is billed each period"
},
"discountPercentage": {
"type": "number",
"description": "The discount applied to the plan's list price, 0 when none"
},
"recurringPriceListed": {
"type": "number",
"description": "The plan's list price for the chosen billing period, before any discount"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "On a preview, the plan and its recurring price so the cost can be shown; null once the checkout is started."
},
"checkoutUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The hosted Stripe Checkout link to open in a browser, or null for a preview / if none was returned."
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The pending subscription created for the checkout, or null for a preview."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Rate an accepted creator on reliability and content quality for a campaign — the reporting tab's rate action. The creator is notified of the rating, and a non-admin cannot change it once submitted, so it is preview-then-confirm and the preview names the campaign's brand. The platform requires the creator's task to be complete and refuses a duplicate rating (task_not_completed, influencer_application_was_not_accepted, influencer_rating_already_exists surfaced as-is). No brand needs to be selected — the campaign names the brand.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
campaignId
The id of the campaign the creator worked on.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
quality
The content-quality rating (stars).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
reliability
The reliability rating (stars).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
userId
The creator's user id (from list-reporting-submissions' userId).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"quality",
"reliability",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator who was rated"
},
"quality": {
"type": "number",
"description": "The content-quality rating"
},
"performed": {
"type": "boolean",
"description": "Whether the rating was submitted (true) or this is a preview only (false)"
},
"campaignId": {
"type": "number",
"description": "The campaign the rating is for"
},
"reliability": {
"type": "number",
"description": "The reliability rating"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "rate-influencer",
"title": "Rate a creator on a campaign",
"description": "Rate an accepted creator on reliability and content quality for a campaign — the reporting tab's rate action. The creator is notified of the rating, and a non-admin cannot change it once submitted, so it is preview-then-confirm and the preview names the campaign's brand. The platform requires the creator's task to be complete and refuses a duplicate rating (task_not_completed, influencer_application_was_not_accepted, influencer_rating_already_exists surfaced as-is). No brand needs to be selected — the campaign names the brand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"quality",
"reliability",
"userId"
],
"properties": {
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user id (from list-reporting-submissions' userId)."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"quality": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The content-quality rating (stars)."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the creator worked on."
},
"reliability": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The reliability rating (stars)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"quality",
"reliability",
"userId"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator who was rated"
},
"quality": {
"type": "number",
"description": "The content-quality rating"
},
"performed": {
"type": "boolean",
"description": "Whether the rating was submitted (true) or this is a preview only (false)"
},
"campaignId": {
"type": "number",
"description": "The campaign the rating is for"
},
"reliability": {
"type": "number",
"description": "The reliability rating"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Reactivate a campaign's deactivated applications — ones that were set inactive and so dropped out of every applicant list — bringing those creators back so they can take part. The usual cause is the campaign being moved back to draft: unpublishing a campaign deactivates all of its applications (each keeps its status, e.g. 'pending', but goes inactive and hidden), and this restores them. It acts on inactive applications only — it does not touch the normal declined or cancelled lists, which stay active. An outward-facing change, so it is preview-then-confirm — the preview is a dry run that reports nothing; the real count comes only once you confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. The platform restricts this to Refluenced staff and to campaigns still in their application phase, and returns how many applications were reactivated; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose applications to reactivate, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"reactivatedCount"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the reactivation was applied (true) or this is a preview only (false)."
},
"reactivatedCount": {
"type": "number",
"description": "How many applications were reactivated (0 for a preview)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reactivate-applications",
"title": "Reactivate a campaign's deactivated applications",
"description": "Reactivate a campaign's deactivated applications — ones that were set inactive and so dropped out of every applicant list — bringing those creators back so they can take part. The usual cause is the campaign being moved back to draft: unpublishing a campaign deactivates all of its applications (each keeps its status, e.g. 'pending', but goes inactive and hidden), and this restores them. It acts on inactive applications only — it does not touch the normal declined or cancelled lists, which stay active. An outward-facing change, so it is preview-then-confirm — the preview is a dry run that reports nothing; the real count comes only once you confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. The platform restricts this to Refluenced staff and to campaigns still in their application phase, and returns how many applications were reactivated; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose applications to reactivate, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"reactivatedCount"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the reactivation was applied (true) or this is a preview only (false)."
},
"reactivatedCount": {
"type": "number",
"description": "How many applications were reactivated (0 for a preview)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Move a TikTok submission to another of the same creator's campaign applications — the reporting view's admin reassign action, for correcting a video filed against the wrong application. The target application must belong to the same creator, or the platform 404s (surfaced as-is). It recomputes both the old and new applications' cached TikTok figures and completion. Applies directly, mirroring the one-click web action; admin-only platform-side — a non-admin is refused, surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the campaign application to move the submission to. Must belong to the same creator — the platform 404s otherwise.
Clear enough to supply this argument.
submissionId
The TikTok submission's id (the TikTok-video media id from list-campaign-media, not the aweme id).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"moved",
"submissionId"
],
"properties": {
"moved": {
"type": "boolean",
"description": "Whether the submission was reassigned"
},
"submissionId": {
"type": "number",
"description": "The TikTok submission id that was moved"
},
"applicationId": {
"type": "number",
"description": "The application the submission was moved to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reassign-tiktok-submission",
"title": "Reassign a TikTok submission",
"description": "Move a TikTok submission to another of the same creator's campaign applications — the reporting view's admin reassign action, for correcting a video filed against the wrong application. The target application must belong to the same creator, or the platform 404s (surfaced as-is). It recomputes both the old and new applications' cached TikTok figures and completion. Applies directly, mirroring the one-click web action; admin-only platform-side — a non-admin is refused, surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"submissionId"
],
"properties": {
"submissionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The TikTok submission's id (the TikTok-video media id from list-campaign-media, not the aweme id)."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign application to move the submission to. Must belong to the same creator — the platform 404s otherwise."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"moved",
"submissionId"
],
"properties": {
"moved": {
"type": "boolean",
"description": "Whether the submission was reassigned"
},
"submissionId": {
"type": "number",
"description": "The TikTok submission id that was moved"
},
"applicationId": {
"type": "number",
"description": "The application the submission was moved to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Restore a soft-deleted campaign, bringing it back to active — the inverse of delete-campaign and the partner of list-deleted-campaigns. It is reversible (the campaign can be deleted again) and internal, a one-click admin action, so it applies directly. Admin-only and global: no brand is selected, and the platform refuses a non-admin (and a missing campaign) as-is. Target it by campaignId from list-deleted-campaigns.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the deleted campaign to restore, from list-deleted-campaigns.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"title"
],
"properties": {
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The restored campaign's title, or null"
},
"performed": {
"type": "boolean",
"description": "Whether the restore was applied — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign that was restored"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "recover-campaign",
"title": "Restore a deleted campaign",
"description": "Restore a soft-deleted campaign, bringing it back to active — the inverse of delete-campaign and the partner of list-deleted-campaigns. It is reversible (the campaign can be deleted again) and internal, a one-click admin action, so it applies directly. Admin-only and global: no brand is selected, and the platform refuses a non-admin (and a missing campaign) as-is. Target it by campaignId from list-deleted-campaigns.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the deleted campaign to restore, from list-deleted-campaigns."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"title"
],
"properties": {
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The restored campaign's title, or null"
},
"performed": {
"type": "boolean",
"description": "Whether the restore was applied — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign that was restored"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Force a re-scrape of a campaign's synced content to refresh its reporting numbers — the reporting tab's admin 'scrape views' action. Pass mediaIds to refresh only some pieces, or omit to refresh all synced media. It runs in the background, so re-read with get-campaign-reporting shortly to see the updated numbers. UGC campaigns cannot be scraped (ugc_campaign_cannot_be_scraped is surfaced as-is). Reads any campaign by id; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose stats to refresh.
Clear enough to supply this argument.
mediaIds
Optional specific media ids to re-scrape (from list-campaign-media); omit to refresh all synced media.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"mediaIds",
"queued"
],
"properties": {
"queued": {
"type": "boolean",
"description": "Whether the refresh was queued"
},
"mediaIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"description": "The specific media queued, or null when all synced media were"
},
"campaignId": {
"type": "number",
"description": "The campaign whose stats were refreshed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "refresh-campaign-stats",
"title": "Refresh a campaign's reporting stats",
"description": "Force a re-scrape of a campaign's synced content to refresh its reporting numbers — the reporting tab's admin 'scrape views' action. Pass mediaIds to refresh only some pieces, or omit to refresh all synced media. It runs in the background, so re-read with get-campaign-reporting shortly to see the updated numbers. UGC campaigns cannot be scraped (ugc_campaign_cannot_be_scraped is surfaced as-is). Reads any campaign by id; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"mediaIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"description": "Optional specific media ids to re-scrape (from list-campaign-media); omit to refresh all synced media."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose stats to refresh."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"mediaIds",
"queued"
],
"properties": {
"queued": {
"type": "boolean",
"description": "Whether the refresh was queued"
},
"mediaIds": {
"anyOf": [
{
"type": "array",
"items": {
"type": "number"
}
},
{
"type": "null"
}
],
"description": "The specific media queued, or null when all synced media were"
},
"campaignId": {
"type": "number",
"description": "The campaign whose stats were refreshed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Re-fetch a creator's Instagram follower count and engagement rate live from Instagram and save them — the edit page's admin 'Update followers & engagement' action. Admin-only, and it needs a valid Instagram handle on the account; the platform refuses (400) when it cannot fetch the figures, surfaced as-is. Applies directly. To set the figures by hand instead of re-fetching, use update-influencer-instagram. The refreshed profile is returned in full.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
Shorten the title to an action and subject; move usage details into the description.
Description95/100
Re-fetch a submission's recent post, reel and story insights live from Instagram and re-cache the figures on the application — the admin 'refresh insights' action, which applies directly. Use it when the stored reach/views numbers are stale; follow with get-content-submission or list-reporting-submissions to read the refreshed values. Target it by applicationId.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application whose Instagram insights to refresh, from list-applications or list-campaign-content.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the refresh ran — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose insights were refreshed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "refresh-submission-insights",
"title": "Refresh a submission's Instagram insights",
"description": "Re-fetch a submission's recent post, reel and story insights live from Instagram and re-cache the figures on the application — the admin 'refresh insights' action, which applies directly. Use it when the stored reach/views numbers are stale; follow with get-content-submission or list-reporting-submissions to read the refreshed values. Target it by applicationId.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application whose Instagram insights to refresh, from list-applications or list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the refresh ran — always true; this tool writes directly"
},
"applicationId": {
"type": "number",
"description": "The application whose insights were refreshed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Refund the cash reward paid for a creator's participation — returned via Stripe to the brand's card, or as credits to their balance. It moves money and cannot be undone, so it is preview-then-confirm and the preview names the brand. The platform restricts this to Refluenced staff and returns its refusals (already_refunded, application_not_paid, no_invoice_found, no_cash_reward_amount, stripe_refund_failed) as-is. Target it by applicationId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application to refund the cash reward on, from list-applications or list-campaign-content.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the refund was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application whose cash reward was refunded"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "refund-cash-reward",
"title": "Refund a creator's cash reward",
"description": "Refund the cash reward paid for a creator's participation — returned via Stripe to the brand's card, or as credits to their balance. It moves money and cannot be undone, so it is preview-then-confirm and the preview names the brand. The platform restricts this to Refluenced staff and returns its refusals (already_refunded, application_not_paid, no_invoice_found, no_cash_reward_amount, stripe_refund_failed) as-is. Target it by applicationId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application to refund the cash reward on, from list-applications or list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the refund was applied (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application whose cash reward was refunded"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Reject every pending brand-ambassador candidate for a brand at once — the web's 'reject all' action. It sends no notification, but because it clears the whole queue in one step it is preview-then-confirm: the preview reads the pending count and names the brand, and the rejection runs in the background, returning how many were queued. To reject a single candidate instead, use reject-ambassador. Scope it by the brand's companyId (from list-brands — resolve and disambiguate first).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId",
"pendingCount",
"performed",
"queuedCount"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand whose candidates were rejected"
},
"performed": {
"type": "boolean",
"description": "Whether the bulk reject was queued (true) or this is a preview only (false)."
},
"queuedCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many candidates were queued for rejection, or null on preview"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending candidates there were (shown on preview), or null after the action"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reject-all-ambassadors",
"title": "Reject all pending brand-ambassador candidates",
"description": "Reject every pending brand-ambassador candidate for a brand at once — the web's 'reject all' action. It sends no notification, but because it clears the whole queue in one step it is preview-then-confirm: the preview reads the pending count and names the brand, and the rejection runs in the background, returning how many were queued. To reject a single candidate instead, use reject-ambassador. Scope it by the brand's companyId (from list-brands — resolve and disambiguate first).",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"companyId",
"pendingCount",
"performed",
"queuedCount"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand whose candidates were rejected"
},
"performed": {
"type": "boolean",
"description": "Whether the bulk reject was queued (true) or this is a preview only (false)."
},
"queuedCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many candidates were queued for rejection, or null on preview"
},
"pendingCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending candidates there were (shown on preview), or null after the action"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Reject a pending brand-ambassador candidate for a brand. This is the one-click action the web applies directly — it sends no notification to the creator and makes no group change. Target it by the candidate's ambassadorId (from list-potential-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown candidate (pending_ambassador_not_found), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
ambassadorId
The candidate's ambassadorId, from list-potential-ambassadors.
Clear enough to supply this argument.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the candidate was rejected for"
},
"performed": {
"type": "boolean",
"description": "Whether the candidate was rejected — always true; this tool writes directly"
},
"ambassadorId": {
"type": "number",
"description": "The candidate that was rejected"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reject-ambassador",
"title": "Reject a brand-ambassador candidate",
"description": "Reject a pending brand-ambassador candidate for a brand. This is the one-click action the web applies directly — it sends no notification to the creator and makes no group change. Target it by the candidate's ambassadorId (from list-potential-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown candidate (pending_ambassador_not_found), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId"
],
"properties": {
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
},
"ambassadorId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The candidate's ambassadorId, from list-potential-ambassadors."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the candidate was rejected for"
},
"performed": {
"type": "boolean",
"description": "Whether the candidate was rejected — always true; this tool writes directly"
},
"ambassadorId": {
"type": "number",
"description": "The candidate that was rejected"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Reject a creator's Instagram or TikTok verification with a reason, by their userId (from get-influencer or search-influencer-network) — the edit page's admin reject action. The reason is shown to the creator. This is outward-facing — it notifies the creator by push — so it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to apply. The platform refuses a second rejection once one has been sent (rejection_message_already_sent), and is admin-only — any refusal is surfaced as-is. To verify or un-verify without a reason, use verify-influencer-channel.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channel
Which channel's verification to reject (UGC has no rejection).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
reason
Why the verification is rejected — shown to the creator. (Instagram's UI omits 'activity'.)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
userId
The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"performed",
"reason",
"userId"
],
"properties": {
"reason": {
"type": "string",
"description": "The rejection reason that was sent"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"channel": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "The channel that was targeted"
},
"performed": {
"type": "boolean",
"description": "Whether the rejection was applied (false for a preview)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reject-influencer-verification",
"title": "Reject an influencer's channel verification",
"description": "Reject a creator's Instagram or TikTok verification with a reason, by their userId (from get-influencer or search-influencer-network) — the edit page's admin reject action. The reason is shown to the creator. This is outward-facing — it notifies the creator by push — so it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to apply. The platform refuses a second rejection once one has been sent (rejection_message_already_sent), and is admin-only — any refusal is surfaced as-is. To verify or un-verify without a reason, use verify-influencer-channel.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"reason",
"userId"
],
"properties": {
"reason": {
"enum": [
"activity",
"demographics",
"low_engagement",
"low_followers",
"other",
"poor_content_quality",
"product_tester"
],
"type": "string",
"description": "Why the verification is rejected — shown to the creator. (Instagram's UI omits 'activity'.)"
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId."
},
"channel": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Which channel's verification to reject (UGC has no rejection)."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"performed",
"reason",
"userId"
],
"properties": {
"reason": {
"type": "string",
"description": "The rejection reason that was sent"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"channel": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "The channel that was targeted"
},
"performed": {
"type": "boolean",
"description": "Whether the rejection was applied (false for a preview)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Remove a member from an agency by user id. This revokes the person's access to the agency and every brand under it. Removing someone's access is outward-facing, so it is preview-then-confirm: called with confirm false (the default) it only previews, naming the agency and the member; set confirm true to remove. Target the agency by agencyId and the member by userId (from list-agency-members); no scope needs to be selected. The platform enforces the rest — it refuses removing the agency's only user, its owner before a new owner is set, or the last owner of a brand under it, and a single-brand agency is directed to ownership transfer instead — any refusal surfaced as-is. To remove a pending invitation instead, use revoke-agency-invitation.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of the agency the member belongs to, from list-agencies, list-brands or list-agency-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
userId
The user id of the member to remove, from list-agency-members.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"performed",
"removed"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was removed"
},
"removed": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The removed member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's name, or null when not set"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The removed member once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the member was removed (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-agency-member",
"title": "Remove an agency member",
"description": "Remove a member from an agency by user id. This revokes the person's access to the agency and every brand under it. Removing someone's access is outward-facing, so it is preview-then-confirm: called with confirm false (the default) it only previews, naming the agency and the member; set confirm true to remove. Target the agency by agencyId and the member by userId (from list-agency-members); no scope needs to be selected. The platform enforces the rest — it refuses removing the agency's only user, its owner before a new owner is set, or the last owner of a brand under it, and a single-brand agency is directed to ownership transfer instead — any refusal surfaced as-is. To remove a pending invitation instead, use revoke-agency-invitation.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"userId"
],
"properties": {
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The user id of the member to remove, from list-agency-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency the member belongs to, from list-agencies, list-brands or list-agency-members."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"performed",
"removed"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was removed"
},
"removed": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The removed member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's name, or null when not set"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The removed member once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the member was removed (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Remove a creator's current ambassadorship from a brand — takes them out of the brand's ambassador group. It is preview-then-confirm and names the brand because it is partly irreversible: an accepted ambassadorship is set back to rejected, but an implicit one (earned by a referral, never explicitly accepted) is deleted outright and cannot be restored. Target it by the ambassadorId (from list-brand-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown ambassador (ambassador_not_found), surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
ambassadorId
The ambassadorId of the current ambassador to remove, from list-brand-ambassadors.
Clear enough to supply this argument.
companyId
The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the ambassador was removed from"
},
"performed": {
"type": "boolean",
"description": "Whether the removal was applied (true) or this is a preview only (false)."
},
"ambassadorId": {
"type": "number",
"description": "The ambassador that was removed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-ambassador",
"title": "Remove a current brand ambassador",
"description": "Remove a creator's current ambassadorship from a brand — takes them out of the brand's ambassador group. It is preview-then-confirm and names the brand because it is partly irreversible: an accepted ambassadorship is set back to rejected, but an implicit one (earned by a referral, never explicitly accepted) is deleted outright and cannot be restored. Target it by the ambassadorId (from list-brand-ambassadors) and the brand's companyId (from list-brands — resolve and disambiguate first). The platform refuses an unknown ambassador (ambassador_not_found), surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand's company id (from list-brands). Resolve the brand name to its id first, and disambiguate."
},
"ambassadorId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The ambassadorId of the current ambassador to remove, from list-brand-ambassadors."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ambassadorId",
"companyId",
"performed"
],
"properties": {
"companyId": {
"type": "number",
"description": "The brand the ambassador was removed from"
},
"performed": {
"type": "boolean",
"description": "Whether the removal was applied (true) or this is a preview only (false)."
},
"ambassadorId": {
"type": "number",
"description": "The ambassador that was removed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Remove a member from a brand by user id. This revokes the person's access and emails them that they were removed, and if the brand is their only membership it deactivates their account — so, like an outward-facing change, it is preview-then-confirm: called with confirm false (the default) it only previews, naming the brand and the member; set confirm true to remove. Target the brand by brandId and the member by userId (from list-brand-members); no brand needs to be selected. The platform enforces the rest — it refuses removing the brand's only owner, an agency admin, or someone who is not a member — any refusal surfaced as-is. To remove a pending invitation instead, use revoke-brand-invitation; to transfer ownership, set-brand-member-role.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand the member belongs to, from list-brands, get-brand or list-brand-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
userId
The user id of the member to remove, from list-brand-members.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"performed",
"removed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was removed"
},
"removed": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The removed member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's name, or null when not set"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The removed member once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the member was removed (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-brand-member",
"title": "Remove a brand member",
"description": "Remove a member from a brand by user id. This revokes the person's access and emails them that they were removed, and if the brand is their only membership it deactivates their account — so, like an outward-facing change, it is preview-then-confirm: called with confirm false (the default) it only previews, naming the brand and the member; set confirm true to remove. Target the brand by brandId and the member by userId (from list-brand-members); no brand needs to be selected. The platform enforces the rest — it refuses removing the brand's only owner, an agency admin, or someone who is not a member — any refusal surfaced as-is. To remove a pending invitation instead, use revoke-brand-invitation; to transfer ownership, set-brand-member-role.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"userId"
],
"properties": {
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The user id of the member to remove, from list-brand-members."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand the member belongs to, from list-brands, get-brand or list-brand-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"performed",
"removed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was removed"
},
"removed": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The removed member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's name, or null when not set"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The removed member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The removed member once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the member was removed (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Detach an influencer group from a campaign's invite plan (deletes the attachment made by invite-group-to-draft-campaign), so it will not be invited when the campaign is published. This is meaningful before publish; once a campaign is live its invitations have already been sent, so detaching the plan does not un-invite anyone. Applies directly. Only a member with write access may detach; the platform refuses otherwise.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the draft campaign to detach the group from.
Clear enough to supply this argument.
groupId
The id of the attached group, from list-campaign-invited-groups.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"detached",
"groupId"
],
"properties": {
"groupId": {
"type": "number",
"description": "The group that was detached"
},
"detached": {
"type": "boolean",
"description": "Whether the group was detached"
},
"campaignId": {
"type": "number",
"description": "The campaign the group was detached from"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-group-from-draft-campaign",
"title": "Detach a group from a draft campaign",
"description": "Detach an influencer group from a campaign's invite plan (deletes the attachment made by invite-group-to-draft-campaign), so it will not be invited when the campaign is published. This is meaningful before publish; once a campaign is live its invitations have already been sent, so detaching the plan does not un-invite anyone. Applies directly. Only a member with write access may detach; the platform refuses otherwise.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"groupId"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the attached group, from list-campaign-invited-groups."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the draft campaign to detach the group from."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"detached",
"groupId"
],
"properties": {
"groupId": {
"type": "number",
"description": "The group that was detached"
},
"detached": {
"type": "boolean",
"description": "Whether the group was detached"
},
"campaignId": {
"type": "number",
"description": "The campaign the group was detached from"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Remove one or more creators from an influencer group (from list-groups) by their influencer profile uuid. When you only know a creator by name or handle, first resolve them to a uuid with list-group-influencers (search within this group) — and if more than one member matches, list the matches and ask which is meant before removing, never guess. Each creator is removed independently, so the result reports which succeeded and which the platform refused. This takes creators out of the group only — it does not delete their profiles. Applies directly, as the web app does. Only a brand or agency member with write access may remove; the platform refuses otherwise.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Resolve the mismatch between this description and its schema constraints.
groupId
The id of the group to remove creators from, from list-groups.
Clear enough to supply this argument.
influencerIds
The influencer profile ids to remove — from list-group-influencers, NOT the userId. This takes creators out of the group; it does not delete their profiles.
Resolve the mismatch between this description and its schema constraints.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"failed",
"groupId",
"removed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"influencerId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why"
},
"influencerId": {
"type": "number",
"description": "The uuid that failed"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be removed"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
},
"removed": {
"type": "array",
"items": {
"type": "number"
},
"description": "The influencer profile ids (uuids) successfully removed from the group"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-influencers-from-group",
"title": "Remove creators from an influencer group",
"description": "Remove one or more creators from an influencer group (from list-groups) by their influencer profile uuid. When you only know a creator by name or handle, first resolve them to a uuid with list-group-influencers (search within this group) — and if more than one member matches, list the matches and ask which is meant before removing, never guess. Each creator is removed independently, so the result reports which succeeded and which the platform refused. This takes creators out of the group only — it does not delete their profiles. Applies directly, as the web app does. Only a brand or agency member with write access may remove; the platform refuses otherwise.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"groupId",
"influencerIds"
],
"properties": {
"groupId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the group to remove creators from, from list-groups."
},
"influencerIds": {
"type": "array",
"items": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
"minItems": 1,
"description": "The influencer profile ids to remove — from list-group-influencers, NOT the userId. This takes creators out of the group; it does not delete their profiles."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"failed",
"groupId",
"removed"
],
"properties": {
"failed": {
"type": "array",
"items": {
"type": "object",
"required": [
"influencerId",
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "Why"
},
"influencerId": {
"type": "number",
"description": "The uuid that failed"
}
},
"additionalProperties": false
},
"description": "Any creators that could not be removed"
},
"groupId": {
"type": "number",
"description": "The group that was targeted"
},
"removed": {
"type": "array",
"items": {
"type": "number"
},
"description": "The influencer profile ids (uuids) successfully removed from the group"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Remove one video brief from a UGC campaign. Target it by campaignId and ugcContentId (from list-ugc-videos); no brand needs to be selected. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to remove it. Removing a video lowers the campaign's cash reward, which the platform recomputes.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the UGC campaign the video belongs to, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
ugcContentId
The id of the video to remove, from list-ugc-videos.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"removedId"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the video was actually removed (true) or this is a preview only (false)."
},
"removedId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the removed video once confirmed, or null for a preview."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "remove-ugc-video",
"title": "Remove a video from a UGC campaign",
"description": "Remove one video brief from a UGC campaign. Target it by campaignId and ugcContentId (from list-ugc-videos); no brand needs to be selected. By default it performs no write: it returns a preview naming the brand for you to confirm with the user. Call again with confirm: true to remove it. Removing a video lowers the campaign's cash reward, which the platform recomputes.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"ugcContentId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC campaign the video belongs to, from list-campaigns, search-campaigns or get-campaign."
},
"ugcContentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the video to remove, from list-ugc-videos."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"removedId"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the video was actually removed (true) or this is a preview only (false)."
},
"removedId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the removed video once confirmed, or null for a preview."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Draw a chart in Refluenced's brand palette and return it as a view, so every chart in the conversation looks like it came from Refluenced. Use this for any chart — a breakdown, a ranking, a comparison, or a trend — whether the figures come from another Refluenced tool (campaign reporting, audience demographics, the ambassador and social-mention rankings, group composition, an open-data query) or from data a user simply asks you to visualize. Pass the series straight from the figures already in the text: `categories` are the x-axis ticks (or pie slices) and each `series` carries one value per category. Leave `colorRole` on "auto" to let the chart assign brand colors by the job it does. This only presents data you already have — it reads and writes nothing on the platform — so always keep the numbers themselves alongside the chart.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
categories
The category-axis labels: the x-axis ticks for bar/line/area, or the slice labels for pie/donut. Every series' values line up with these by index.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
chartType
The chart form. bar for breakdowns, rankings and comparisons; line/area for trends over an ordered axis; pie/donut for parts of a whole.
Clear enough to supply this argument.
colorRole
How colors are assigned. Leave "auto" to let the chart decide from the data: one positive series reads as magnitude (a single brand hue per bar), one series crossing zero as polarity (red below / green above the baseline), two or more series as categorical (a distinct brand hue per series). Override only to force one.
Clear enough to supply this argument.
colors
Optional explicit brand colours overriding the automatic by-job colouring, aligned by index — one per series for bar/line/area, or one per category (slice) for pie/donut. Use only to match a fixed convention: the gender split, for example, is men blue and women pink — so pass ["blue", "pink"] aligned to categories [men, women] (or ["pink", "blue"] for [women, men]). Omit to colour by the job the chart does.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orientation
Bar orientation — use horizontal for long ranking labels. Ignored by line, area, pie and donut.
Clear enough to supply this argument.
series › items › name
The series label, shown in the legend and tooltips (e.g. "Reach", "Women", "2024").
Clear enough to supply this argument.
series › items › values
The series' values, one per category and aligned to `categories` by index. Use null for a missing point (left as a gap on a line/area, treated as zero on a bar/pie).
Clear enough to supply this argument.
stacked
Stack multiple bar or area series instead of placing them side by side. Ignored for a single series and for line/pie/donut.
Clear enough to supply this argument.
subtitle
An optional one-line subtitle shown under the title.
Clear enough to supply this argument.
title
The chart title, shown above the plot.
Clear enough to supply this argument.
unit
An optional unit suffix for values, e.g. "%" or "CHF", shown on the value axis, labels and tooltips.
Clear enough to supply this argument.
valueLabels
Draw each value as a label on its mark. Good for small bar and pie charts; leave off for dense line charts.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categories",
"chartType",
"colorRole",
"orientation",
"series",
"stacked",
"title",
"valueLabels"
],
"properties": {
"unit": {
"type": "string",
"description": "An optional unit suffix for values, e.g. \"%\" or \"CHF\", shown on the value axis, labels and tooltips."
},
"title": {
"type": "string",
"description": "The chart title, shown above the plot."
},
"colors": {
"type": "array",
"items": {
"enum": [
"blue",
"green",
"pink",
"violet"
],
"type": "string"
},
"description": "Optional explicit brand colours overriding the automatic by-job colouring, aligned by index — one per series for bar/line/area, or one per category (slice) for pie/donut. Use only to match a fixed convention: the gender split, for example, is men blue and women pink — so pass [\"blue\", \"pink\"] aligned to categories [men, women] (or [\"pink\", \"blue\"] for [women, men]). Omit to colour by the job the chart does."
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"values"
],
"properties": {
"name": {
"type": "string",
"description": "The series label, shown in the legend and tooltips (e.g. \"Reach\", \"Women\", \"2024\")."
},
"values": {
"type": "array",
"items": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"description": "The series' values, one per category and aligned to `categories` by index. Use null for a missing point (left as a gap on a line/area, treated as zero on a bar/pie)."
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "One series per measure being compared. A single series is one set of bars or one line; multiple series are grouped (or stacked) bars or multiple lines. For pie/donut only the first series is used, across the categories."
},
"stacked": {
"type": "boolean",
"default": false,
"description": "Stack multiple bar or area series instead of placing them side by side. Ignored for a single series and for line/pie/donut."
},
"subtitle": {
"type": "string",
"description": "An optional one-line subtitle shown under the title."
},
"chartType": {
"enum": [
"area",
"bar",
"donut",
"line",
"pie"
],
"type": "string",
"description": "The chart form. bar for breakdowns, rankings and comparisons; line/area for trends over an ordered axis; pie/donut for parts of a whole."
},
"colorRole": {
"enum": [
"auto",
"categorical",
"magnitude",
"polarity"
],
"type": "string",
"default": "auto",
"description": "How colors are assigned. Leave \"auto\" to let the chart decide from the data: one positive series reads as magnitude (a single brand hue per bar), one series crossing zero as polarity (red below / green above the baseline), two or more series as categorical (a distinct brand hue per series). Override only to force one."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The category-axis labels: the x-axis ticks for bar/line/area, or the slice labels for pie/donut. Every series' values line up with these by index."
},
"orientation": {
"enum": [
"horizontal",
"vertical"
],
"type": "string",
"default": "vertical",
"description": "Bar orientation — use horizontal for long ranking labels. Ignored by line, area, pie and donut."
},
"valueLabels": {
"type": "boolean",
"default": false,
"description": "Draw each value as a label on its mark. Good for small bar and pie charts; leave off for dense line charts."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "render-chart",
"title": "Render a chart in Refluenced's palette",
"description": "Draw a chart in Refluenced's brand palette and return it as a view, so every chart in the conversation looks like it came from Refluenced. Use this for any chart — a breakdown, a ranking, a comparison, or a trend — whether the figures come from another Refluenced tool (campaign reporting, audience demographics, the ambassador and social-mention rankings, group composition, an open-data query) or from data a user simply asks you to visualize. Pass the series straight from the figures already in the text: `categories` are the x-axis ticks (or pie slices) and each `series` carries one value per category. Leave `colorRole` on \"auto\" to let the chart assign brand colors by the job it does. This only presents data you already have — it reads and writes nothing on the platform — so always keep the numbers themselves alongside the chart.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categories",
"chartType",
"series",
"title"
],
"properties": {
"unit": {
"type": "string",
"description": "An optional unit suffix for values, e.g. \"%\" or \"CHF\", shown on the value axis, labels and tooltips."
},
"title": {
"type": "string",
"description": "The chart title, shown above the plot."
},
"colors": {
"type": "array",
"items": {
"enum": [
"blue",
"green",
"pink",
"violet"
],
"type": "string"
},
"description": "Optional explicit brand colours overriding the automatic by-job colouring, aligned by index — one per series for bar/line/area, or one per category (slice) for pie/donut. Use only to match a fixed convention: the gender split, for example, is men blue and women pink — so pass [\"blue\", \"pink\"] aligned to categories [men, women] (or [\"pink\", \"blue\"] for [women, men]). Omit to colour by the job the chart does."
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"values"
],
"properties": {
"name": {
"type": "string",
"description": "The series label, shown in the legend and tooltips (e.g. \"Reach\", \"Women\", \"2024\")."
},
"values": {
"type": "array",
"items": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"description": "The series' values, one per category and aligned to `categories` by index. Use null for a missing point (left as a gap on a line/area, treated as zero on a bar/pie)."
}
}
},
"minItems": 1,
"description": "One series per measure being compared. A single series is one set of bars or one line; multiple series are grouped (or stacked) bars or multiple lines. For pie/donut only the first series is used, across the categories."
},
"stacked": {
"type": "boolean",
"default": false,
"description": "Stack multiple bar or area series instead of placing them side by side. Ignored for a single series and for line/pie/donut."
},
"subtitle": {
"type": "string",
"description": "An optional one-line subtitle shown under the title."
},
"chartType": {
"enum": [
"area",
"bar",
"donut",
"line",
"pie"
],
"type": "string",
"description": "The chart form. bar for breakdowns, rankings and comparisons; line/area for trends over an ordered axis; pie/donut for parts of a whole."
},
"colorRole": {
"enum": [
"auto",
"categorical",
"magnitude",
"polarity"
],
"type": "string",
"default": "auto",
"description": "How colors are assigned. Leave \"auto\" to let the chart decide from the data: one positive series reads as magnitude (a single brand hue per bar), one series crossing zero as polarity (red below / green above the baseline), two or more series as categorical (a distinct brand hue per series). Override only to force one."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The category-axis labels: the x-axis ticks for bar/line/area, or the slice labels for pie/donut. Every series' values line up with these by index."
},
"orientation": {
"enum": [
"horizontal",
"vertical"
],
"type": "string",
"default": "vertical",
"description": "Bar orientation — use horizontal for long ranking labels. Ignored by line, area, pie and donut."
},
"valueLabels": {
"type": "boolean",
"default": false,
"description": "Draw each value as a label on its mark. Good for small bar and pie charts; leave off for dense line charts."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"categories",
"chartType",
"colorRole",
"orientation",
"series",
"stacked",
"title",
"valueLabels"
],
"properties": {
"unit": {
"type": "string",
"description": "An optional unit suffix for values, e.g. \"%\" or \"CHF\", shown on the value axis, labels and tooltips."
},
"title": {
"type": "string",
"description": "The chart title, shown above the plot."
},
"colors": {
"type": "array",
"items": {
"enum": [
"blue",
"green",
"pink",
"violet"
],
"type": "string"
},
"description": "Optional explicit brand colours overriding the automatic by-job colouring, aligned by index — one per series for bar/line/area, or one per category (slice) for pie/donut. Use only to match a fixed convention: the gender split, for example, is men blue and women pink — so pass [\"blue\", \"pink\"] aligned to categories [men, women] (or [\"pink\", \"blue\"] for [women, men]). Omit to colour by the job the chart does."
},
"series": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"values"
],
"properties": {
"name": {
"type": "string",
"description": "The series label, shown in the legend and tooltips (e.g. \"Reach\", \"Women\", \"2024\")."
},
"values": {
"type": "array",
"items": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"description": "The series' values, one per category and aligned to `categories` by index. Use null for a missing point (left as a gap on a line/area, treated as zero on a bar/pie)."
}
},
"additionalProperties": false
},
"minItems": 1,
"description": "One series per measure being compared. A single series is one set of bars or one line; multiple series are grouped (or stacked) bars or multiple lines. For pie/donut only the first series is used, across the categories."
},
"stacked": {
"type": "boolean",
"default": false,
"description": "Stack multiple bar or area series instead of placing them side by side. Ignored for a single series and for line/pie/donut."
},
"subtitle": {
"type": "string",
"description": "An optional one-line subtitle shown under the title."
},
"chartType": {
"enum": [
"area",
"bar",
"donut",
"line",
"pie"
],
"type": "string",
"description": "The chart form. bar for breakdowns, rankings and comparisons; line/area for trends over an ordered axis; pie/donut for parts of a whole."
},
"colorRole": {
"enum": [
"auto",
"categorical",
"magnitude",
"polarity"
],
"type": "string",
"default": "auto",
"description": "How colors are assigned. Leave \"auto\" to let the chart decide from the data: one positive series reads as magnitude (a single brand hue per bar), one series crossing zero as polarity (red below / green above the baseline), two or more series as categorical (a distinct brand hue per series). Override only to force one."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1,
"description": "The category-axis labels: the x-axis ticks for bar/line/area, or the slice labels for pie/donut. Every series' values line up with these by index."
},
"orientation": {
"enum": [
"horizontal",
"vertical"
],
"type": "string",
"default": "vertical",
"description": "Bar orientation — use horizontal for long ranking labels. Ignored by line, area, pie and donut."
},
"valueLabels": {
"type": "boolean",
"default": false,
"description": "Draw each value as a label on its mark. Good for small bar and pie charts; leave off for dense line charts."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Send a price counter-offer to a pro applicant who proposed their own price and buyout. Only the influencer can respond (accept or decline) — and a counter-offer can be sent only once: it cannot be edited or withdrawn once sent, so this is preview-then-confirm and the preview names the brand. The platform requires the application to still be pending and to already carry a proposed price, and enforces the value limits; any refusal (renegotiation_request_already_exists, application_is_not_pending, pro_influencer_price_too_high, content_unit_price_below_minimum) is surfaced as-is. Target it by applicationId from list-applications.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationId
The id of the pro applicant's application to counter-offer, from list-applications.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
contentUnitPrice
The buyout price per content piece you are proposing. The web app uses a minimum of 45 and a maximum of 5000; the platform enforces the effective limits and refuses out-of-range values.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
A message to the influencer explaining the counter-offer.
Clear enough to supply this argument.
price
The total price (cash fee) you are proposing. The platform caps this at 5000 and refuses higher values.
Resolve the mismatch between this description and its schema constraints.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"contentUnitPrice",
"performed",
"price"
],
"properties": {
"price": {
"type": "number",
"description": "The total price that was proposed"
},
"performed": {
"type": "boolean",
"description": "Whether the counter-offer was sent (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application the counter-offer was sent on"
},
"contentUnitPrice": {
"type": "number",
"description": "The buyout price per content that was proposed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "renegotiate-application-price",
"title": "Counter-offer a pro applicant's price",
"description": "Send a price counter-offer to a pro applicant who proposed their own price and buyout. Only the influencer can respond (accept or decline) — and a counter-offer can be sent only once: it cannot be edited or withdrawn once sent, so this is preview-then-confirm and the preview names the brand. The platform requires the application to still be pending and to already carry a proposed price, and enforces the value limits; any refusal (renegotiation_request_already_exists, application_is_not_pending, pro_influencer_price_too_high, content_unit_price_below_minimum) is surfaced as-is. Target it by applicationId from list-applications.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"contentUnitPrice",
"message",
"price"
],
"properties": {
"price": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The total price (cash fee) you are proposing. The platform caps this at 5000 and refuses higher values.",
"exclusiveMinimum": 0
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"message": {
"type": "string",
"minLength": 1,
"description": "A message to the influencer explaining the counter-offer."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the pro applicant's application to counter-offer, from list-applications."
},
"contentUnitPrice": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The buyout price per content piece you are proposing. The web app uses a minimum of 45 and a maximum of 5000; the platform enforces the effective limits and refuses out-of-range values.",
"exclusiveMinimum": 0
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"contentUnitPrice",
"performed",
"price"
],
"properties": {
"price": {
"type": "number",
"description": "The total price that was proposed"
},
"performed": {
"type": "boolean",
"description": "Whether the counter-offer was sent (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application the counter-offer was sent on"
},
"contentUnitPrice": {
"type": "number",
"description": "The buyout price per content that was proposed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Reopen a resolved flagged message (status → UNRESOLVED), putting it back in the violations queue and clearing its outcome — the undo for resolve-flagged-message. It applies directly. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
flagId
The id of the resolved flagged message to reopen, from list-flagged-messages.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flag",
"performed"
],
"properties": {
"flag": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"description": "The flag after reopening, now UNRESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the flag was reopened — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reopen-flagged-message",
"title": "Reopen a flagged chat message",
"description": "Reopen a resolved flagged message (status → UNRESOLVED), putting it back in the violations queue and clearing its outcome — the undo for resolve-flagged-message. It applies directly. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flagId"
],
"properties": {
"flagId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the resolved flagged message to reopen, from list-flagged-messages."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flag",
"performed"
],
"properties": {
"flag": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"description": "The flag after reopening, now UNRESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the flag was reopened — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Reopen a dismissed review ticket (status → OPEN), putting it back in the action queue — the undo for dismiss-review-ticket. It applies directly. The platform allows at most one open ticket per application and type, so a reopen that would collide with an already-open ticket is refused with open_ticket_already_exists, surfaced as-is. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
ticketId
The id of the resolved review ticket to reopen, from list-review-tickets.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"ticket"
],
"properties": {
"ticket": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"description": "The ticket after reopening, now OPEN",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the ticket was reopened — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "reopen-review-ticket",
"title": "Reopen an admin hub review ticket",
"description": "Reopen a dismissed review ticket (status → OPEN), putting it back in the action queue — the undo for dismiss-review-ticket. It applies directly. The platform allows at most one open ticket per application and type, so a reopen that would collide with an already-open ticket is refused with open_ticket_already_exists, surfaced as-is. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"ticketId"
],
"properties": {
"ticketId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the resolved review ticket to reopen, from list-review-tickets."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"ticket"
],
"properties": {
"ticket": {
"type": "object",
"required": [
"anchorText",
"campaignApplicationId",
"campaignId",
"campaignRequestId",
"campaignTitle",
"campaignUrl",
"chatLink",
"contentDeadline",
"context",
"created",
"id",
"kind",
"owner",
"resolutionAction",
"resolvedAt",
"severity",
"status",
"subjectInstagramUsername",
"subjectName",
"subjectPhase",
"subjectTiktokUsername",
"subjectUuid",
"summary",
"ticketType"
],
"properties": {
"id": {
"type": "number",
"description": "The ticket's id, used to dismiss or reopen it"
},
"kind": {
"enum": [
"ACTION_REQUIRED",
"INFORMATIONAL"
],
"type": "string",
"description": "ACTION_REQUIRED tickets are the action queue; INFORMATIONAL ones are the read-only activity log"
},
"owner": {
"enum": [
"ADMIN",
"BRAND",
"INFLUENCER"
],
"type": "string",
"description": "Whose side the ticket concerns"
},
"status": {
"enum": [
"OPEN",
"RESOLVED"
],
"type": "string",
"description": "Whether the ticket is still open or has been resolved"
},
"context": {
"type": "object",
"description": "The full free-form automation context payload; which fields are present varies by ticketType",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"created": {
"type": "string",
"description": "When the ticket was raised (ISO 8601)"
},
"summary": {
"type": "string",
"description": "The one-line summary of what the ticket is about"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the brand↔creator chat thread (for list-messages/send-message), or null"
},
"severity": {
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string",
"description": "How urgently the ticket needs handling, used to rank it within the action queue"
},
"anchorText": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The text of the chat message the ticket anchors to, or null when none"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the campaign the ticket belongs to, or null"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the ticket was resolved (ISO 8601), or null while open"
},
"ticketType": {
"type": "string",
"description": "The automation's type string, e.g. warning_overdue, stories_missing, brand_cancellation_request"
},
"campaignUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Deep link to the campaign in the web app, or null when there is none"
},
"subjectName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator the ticket is about, or null when not tied to one"
},
"subjectUuid": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's influencer profile id (for get-influencer), or null when they have no profile"
},
"subjectPhase": {
"anyOf": [
{
"enum": [
"active",
"preparation",
"reporting"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "Which campaign-management tab the application currently sits in, for deep-linking; null when none"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title (or brand name fallback), or null"
},
"contentDeadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The content deadline (ISO 8601) from context that drives queue urgency, or null when none"
},
"resolutionAction": {
"type": "string",
"description": "How the ticket was resolved (e.g. dismiss); empty while it is open"
},
"campaignRequestId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign-request id carried in context for a brand-cancellation ticket — pass to respond-to-campaign-request to accept or decline; null when the ticket is not a request."
},
"campaignApplicationId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the application the ticket is about (for complete-task and application reads), or null"
},
"subjectTiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's TikTok handle, or null"
},
"subjectInstagramUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The creator's Instagram handle, or null"
}
},
"description": "The ticket after reopening, now OPEN",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the ticket was reopened — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get a one-time, branded web link the user opens to upload brief document(s) — a PDF, image or other file — for the platform's AI to read when it drafts a campaign. Use this when a user attached, pasted, or dragged a brief file you have no local path for and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. This is the two-step route into create-campaign-with-ai: the AI reads files only from its own request, not from files attached to a campaign afterwards, so a brief must be fed this way (or inline via the files argument when you do have a path or URL). Returns the link plus a briefUploadToken: share the link, ask the user to upload and tell you when done, then call create-campaign-with-ai with that briefUploadToken (alongside the brand, brief and channel) and the AI will read the uploaded file(s). The link is valid briefly; the bytes are held on this server only until create-campaign-with-ai reads them.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
label
Display name for the page heading, e.g. the campaign's working title; omit to show the page without a custom heading.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"briefUploadToken",
"expiresAt",
"uploadUrl"
],
"properties": {
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the brief file(s)."
},
"briefUploadToken": {
"type": "string",
"description": "Pass this to create-campaign-with-ai as briefUploadToken to have the AI read the uploaded file(s)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "request-ai-brief-upload",
"title": "Get a link to upload an AI-brief document",
"description": "Get a one-time, branded web link the user opens to upload brief document(s) — a PDF, image or other file — for the platform's AI to read when it drafts a campaign. Use this when a user attached, pasted, or dragged a brief file you have no local path for and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. This is the two-step route into create-campaign-with-ai: the AI reads files only from its own request, not from files attached to a campaign afterwards, so a brief must be fed this way (or inline via the files argument when you do have a path or URL). Returns the link plus a briefUploadToken: share the link, ask the user to upload and tell you when done, then call create-campaign-with-ai with that briefUploadToken (alongside the brand, brief and channel) and the AI will read the uploaded file(s). The link is valid briefly; the bytes are held on this server only until create-campaign-with-ai reads them.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"label": {
"type": "string",
"description": "Display name for the page heading, e.g. the campaign's working title; omit to show the page without a custom heading."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"briefUploadToken",
"expiresAt",
"uploadUrl"
],
"properties": {
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the brief file(s)."
},
"briefUploadToken": {
"type": "string",
"description": "Pass this to create-campaign-with-ai as briefUploadToken to have the AI read the uploaded file(s)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Get a one-time, branded web link the user opens to add a new payment card. Raw card numbers can never pass through this server (PCI), so this mints a Stripe-backed page where the user enters the card directly — it is tokenized in their browser and saved to the account's Stripe customer, nothing sensitive reaching this server. Address by brandId (the usual way) or agencyId; cards are held on the agency that owns the brand, but present this for the brand the user named. Once they say they're done, the card appears in list-agency-payment-cards and you can make it the default with set-agency-default-card. When the user wants this card to be the default, pass setDefault: true and it is made the default automatically as soon as they finish — no follow-up call needed. The link is valid briefly.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of an agency, from list-agencies. Give this OR brandId.
Clear enough to supply this argument.
brandId
The id of the brand to add a card for, from list-brands. Give this OR agencyId.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
setDefault
Set to true when the user wants this new card to become the default payment method. The card is then made the default automatically once they finish entering it — no follow-up set-agency-default-card call is needed. Omit to add the card without changing which card is the default.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expiresAt",
"setupUrl"
],
"properties": {
"setupUrl": {
"type": "string",
"description": "The one-time link the user opens to enter and save a card."
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "request-card-setup",
"title": "Get a link to add a payment card",
"description": "Get a one-time, branded web link the user opens to add a new payment card. Raw card numbers can never pass through this server (PCI), so this mints a Stripe-backed page where the user enters the card directly — it is tokenized in their browser and saved to the account's Stripe customer, nothing sensitive reaching this server. Address by brandId (the usual way) or agencyId; cards are held on the agency that owns the brand, but present this for the brand the user named. Once they say they're done, the card appears in list-agency-payment-cards and you can make it the default with set-agency-default-card. When the user wants this card to be the default, pass setDefault: true and it is made the default automatically as soon as they finish — no follow-up call needed. The link is valid briefly.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to add a card for, from list-brands. Give this OR agencyId."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId."
},
"setDefault": {
"type": "boolean",
"description": "Set to true when the user wants this new card to become the default payment method. The card is then made the default automatically once they finish entering it — no follow-up set-agency-default-card call is needed. Omit to add the card without changing which card is the default."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expiresAt",
"setupUrl"
],
"properties": {
"setupUrl": {
"type": "string",
"description": "The one-time link the user opens to enter and save a card."
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Get a one-time, branded web link the user opens to upload one file — an image, PDF or other document — to attach to a chat message. Use this when a user attached, pasted, or dragged a file you have no local path for and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. Prefer passing the file inline via send-message's attachment (path or url) when you can; this is the fallback. Returns the link plus an attachmentUploadToken: share the link, ask the user to upload and tell you when done, then call send-message or send-bulk-message with that attachmentUploadToken (alongside the message). The link is valid briefly; the bytes are held on this server only until the send tool reads them, and one message carries one attachment.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
label
Display name for the page heading, e.g. the campaign title or the creator's name; omit to show the page without a custom heading.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"attachmentUploadToken",
"expiresAt",
"uploadUrl"
],
"properties": {
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the attachment."
},
"attachmentUploadToken": {
"type": "string",
"description": "Pass this to send-message or send-bulk-message as attachmentUploadToken to attach the uploaded file."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "request-chat-attachment-upload",
"title": "Get a link to upload a chat attachment",
"description": "Get a one-time, branded web link the user opens to upload one file — an image, PDF or other document — to attach to a chat message. Use this when a user attached, pasted, or dragged a file you have no local path for and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. Prefer passing the file inline via send-message's attachment (path or url) when you can; this is the fallback. Returns the link plus an attachmentUploadToken: share the link, ask the user to upload and tell you when done, then call send-message or send-bulk-message with that attachmentUploadToken (alongside the message). The link is valid briefly; the bytes are held on this server only until the send tool reads them, and one message carries one attachment.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"label": {
"type": "string",
"description": "Display name for the page heading, e.g. the campaign title or the creator's name; omit to show the page without a custom heading."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"attachmentUploadToken",
"expiresAt",
"uploadUrl"
],
"properties": {
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the attachment."
},
"attachmentUploadToken": {
"type": "string",
"description": "Pass this to send-message or send-bulk-message as attachmentUploadToken to attach the uploaded file."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Get a one-time, branded web link the user opens in a browser to upload one or more files you cannot pass to a create/edit tool inline. Use it when a user attached, pasted, or dragged a file (an image, a brief document) and you have no local path the server can read and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. Prefer passing a file inline via path or url when you can; this is the fallback. The page renders in the user's language, is valid briefly, and every file attaches to the platform under the user's own identity. In an environment with shell and network access to the server (e.g. Claude Code) you may fulfil the link yourself by POSTing the file to it; otherwise share the link and ask the user to upload.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
label
Display name for the page heading, e.g. the campaign's title; omit to show the page without a custom heading.
Clear enough to supply this argument.
targetId
The id of the resource the files attach to — a campaign id for the campaign kinds, a brand id for 'brand-logo', or an agency id for 'agency-logo'. All kinds passed in one call must belong to this same id.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
targets
Which upload surfaces to offer on the page: 'brand-logo' (a brand's logo, targetId is the brand id), 'agency-logo' (an agency's logo, targetId is the agency id), 'campaign-image' (the main image), 'campaign-gallery' (product images), 'campaign-asset' (brief documents or videos), 'campaign-codes-csv' (a filled voucher-code/personal-link CSV, exported with export-preparation-csv). Use 'brand-logo' or 'agency-logo' when a user pastes a logo you have no path or URL for. Pass the campaign media kinds together for a full campaign media page, or a single kind for a targeted upload.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expiresAt",
"targetId",
"targets",
"uploadUrl"
],
"properties": {
"targets": {
"type": "array",
"items": {
"enum": [
"agency-logo",
"brand-logo",
"campaign-asset",
"campaign-codes-csv",
"campaign-gallery",
"campaign-image"
],
"type": "string"
},
"description": "The surfaces the link offers."
},
"targetId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id the files attach to."
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the files."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "request-file-upload",
"title": "Get a file-upload link",
"description": "Get a one-time, branded web link the user opens in a browser to upload one or more files you cannot pass to a create/edit tool inline. Use it when a user attached, pasted, or dragged a file (an image, a brief document) and you have no local path the server can read and no public URL — the normal case on the hosted server, where a pasted file lives in a sandbox the server cannot reach. Prefer passing a file inline via path or url when you can; this is the fallback. The page renders in the user's language, is valid briefly, and every file attaches to the platform under the user's own identity. In an environment with shell and network access to the server (e.g. Claude Code) you may fulfil the link yourself by POSTing the file to it; otherwise share the link and ask the user to upload.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"targetId",
"targets"
],
"properties": {
"label": {
"type": "string",
"description": "Display name for the page heading, e.g. the campaign's title; omit to show the page without a custom heading."
},
"targets": {
"type": "array",
"items": {
"enum": [
"agency-logo",
"brand-logo",
"campaign-asset",
"campaign-codes-csv",
"campaign-gallery",
"campaign-image"
],
"type": "string"
},
"minItems": 1,
"description": "Which upload surfaces to offer on the page: 'brand-logo' (a brand's logo, targetId is the brand id), 'agency-logo' (an agency's logo, targetId is the agency id), 'campaign-image' (the main image), 'campaign-gallery' (product images), 'campaign-asset' (brief documents or videos), 'campaign-codes-csv' (a filled voucher-code/personal-link CSV, exported with export-preparation-csv). Use 'brand-logo' or 'agency-logo' when a user pastes a logo you have no path or URL for. Pass the campaign media kinds together for a full campaign media page, or a single kind for a targeted upload."
},
"targetId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the resource the files attach to — a campaign id for the campaign kinds, a brand id for 'brand-logo', or an agency id for 'agency-logo'. All kinds passed in one call must belong to this same id."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expiresAt",
"targetId",
"targets",
"uploadUrl"
],
"properties": {
"targets": {
"type": "array",
"items": {
"enum": [
"agency-logo",
"brand-logo",
"campaign-asset",
"campaign-codes-csv",
"campaign-gallery",
"campaign-image"
],
"type": "string"
},
"description": "The surfaces the link offers."
},
"targetId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id the files attach to."
},
"expiresAt": {
"type": "string",
"description": "ISO-8601 time the link stops working."
},
"uploadUrl": {
"type": "string",
"description": "The one-time link the user opens to upload the files."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Resolve a flagged chat message from the violations queue with an outcome — ACTIONED (a real violation) or FALSE_POSITIVE (not one). It sets the flag to RESOLVED and applies directly, mirroring the one-click web action; the decision is an internal moderation record and is reversible with reopen-flagged-message. It does not discipline anyone — issue a punishment with issue-punishment if the violation warrants it. Admin-only and global; the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
flagId
The id of the flagged message to resolve, from list-flagged-messages.
Clear enough to supply this argument.
outcome
How the flag is resolved: ACTIONED (a real violation you have acted on — discipline the creator separately with issue-punishment if warranted) or FALSE_POSITIVE (not a violation).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flag",
"performed"
],
"properties": {
"flag": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"description": "The flag after resolution, now RESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the flag was resolved — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "resolve-flagged-message",
"title": "Resolve a flagged chat message",
"description": "Resolve a flagged chat message from the violations queue with an outcome — ACTIONED (a real violation) or FALSE_POSITIVE (not one). It sets the flag to RESOLVED and applies directly, mirroring the one-click web action; the decision is an internal moderation record and is reversible with reopen-flagged-message. It does not discipline anyone — issue a punishment with issue-punishment if the violation warrants it. Admin-only and global; the platform refuses a non-admin.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flagId",
"outcome"
],
"properties": {
"flagId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the flagged message to resolve, from list-flagged-messages."
},
"outcome": {
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string",
"description": "How the flag is resolved: ACTIONED (a real violation you have acted on — discipline the creator separately with issue-punishment if warranted) or FALSE_POSITIVE (not a violation)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"flag",
"performed"
],
"properties": {
"flag": {
"type": "object",
"required": [
"campaignTitle",
"chatLink",
"confidence",
"created",
"direction",
"id",
"messageCreated",
"reason",
"resolutionOutcome",
"resolvedAt",
"senderName",
"severity",
"status",
"text",
"violationType"
],
"properties": {
"id": {
"type": "number",
"description": "The flag's id, used to resolve or reopen it"
},
"text": {
"type": "string",
"description": "The text of the flagged chat message"
},
"reason": {
"type": "string",
"description": "The detector's explanation for the flag (may be empty)"
},
"status": {
"enum": [
"RESOLVED",
"UNRESOLVED"
],
"type": "string",
"description": "Whether the flag is still open or has been resolved"
},
"created": {
"type": "string",
"description": "When the flag was raised (ISO 8601)"
},
"chatLink": {
"anyOf": [
{
"type": "object",
"required": [
"campaignId",
"companyId",
"influencerUserId"
],
"properties": {
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand's company id for the chat thread"
},
"campaignId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The campaign id for the brand↔creator chat thread"
},
"influencerUserId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The creator's user id (BaseUser id, as used by the invite and punishment tools) for the chat thread"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ids that address the chat thread the message is in (for list-messages/send-message), or null"
},
"severity": {
"anyOf": [
{
"enum": [
"HIGH",
"LOW",
"MEDIUM"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The flag's severity, or null when the detector did not assign one"
},
"direction": {
"enum": [
"BRAND",
"CREATOR"
],
"type": "string",
"description": "Whether the flagged message was sent by the brand or the creator"
},
"confidence": {
"type": "number",
"description": "The detector's confidence the message is a violation, 0–1"
},
"resolvedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the flag was resolved (ISO 8601), or null while unresolved"
},
"senderName": {
"type": "string",
"description": "The name (or handle) of whoever sent the flagged message"
},
"campaignTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign the flagged message belongs to, or null"
},
"violationType": {
"enum": [
"HATE_SPEECH",
"SOLICITATION"
],
"type": "string",
"description": "The kind of violation — soliciting a move off-platform, or hate speech"
},
"messageCreated": {
"type": "string",
"description": "When the flagged message itself was sent (ISO 8601)"
},
"resolutionOutcome": {
"anyOf": [
{
"enum": [
"ACTIONED",
"FALSE_POSITIVE"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "How the flag was resolved — actioned or a false positive — or null while unresolved"
}
},
"description": "The flag after resolution, now RESOLVED",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the flag was resolved — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Respond to an influencer's extension or cancellation request (from list-campaign-requests). Accepting mirrors the one-click action in the web app and applies directly. Declining notifies the influencer with a reason, so it is preview-then-confirm and the preview names the brand. The platform requires the request to still be pending and restricts brand-cancellation decisions to staff; refusals (request_already_processed, permission_denied) are surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
Whether to accept or decline the request.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign the request belongs to, used to name the brand.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
reason
Required when declining — the reason shown to the influencer. Ignored when accepting.
Clear enough to supply this argument.
requestId
The id of the request to respond to, from list-campaign-requests.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"performed",
"requestId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the response was applied (true) or this is a preview only (false)."
},
"requestId": {
"type": "number",
"description": "The request that was responded to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "respond-to-campaign-request",
"title": "Accept or decline a campaign request",
"description": "Respond to an influencer's extension or cancellation request (from list-campaign-requests). Accepting mirrors the one-click action in the web app and applies directly. Declining notifies the influencer with a reason, so it is preview-then-confirm and the preview names the brand. The platform requires the request to still be pending and restricts brand-cancellation decisions to staff; refusals (request_already_processed, permission_denied) are surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"campaignId",
"requestId"
],
"properties": {
"action": {
"enum": [
"accept",
"decline"
],
"type": "string",
"description": "Whether to accept or decline the request."
},
"reason": {
"type": "string",
"description": "Required when declining — the reason shown to the influencer. Ignored when accepting."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"requestId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the request to respond to, from list-campaign-requests."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the request belongs to, used to name the brand."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"performed",
"requestId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the response was applied (true) or this is a preview only (false)."
},
"requestId": {
"type": "number",
"description": "The request that was responded to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Respond to a pending price renegotiation on an application — the other half of renegotiate-application-price. Accepting commits the proposed price (and, on a non-event campaign, accepts the application); declining ends it. Either way the brand is notified, so this is preview-then-confirm and the preview names the brand and the proposed price. The platform requires a pending renegotiation (renegotiation_not_pending) and refuses an accept on an already-started regular campaign (campaign_already_started); refusals are surfaced as-is. Target it by applicationId from list-applications.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application with a pending price renegotiation to respond to, from list-applications.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
response
Whether to accept the proposed price (commits it) or decline it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"proposedContentUnitPrice",
"proposedPrice",
"response"
],
"properties": {
"response": {
"enum": [
"ACCEPTED",
"DECLINED"
],
"type": "string",
"description": "The response that was sent"
},
"performed": {
"type": "boolean",
"description": "Whether the response was sent (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application the renegotiation was responded to on"
},
"proposedPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The total price the pending offer proposed, or null when none"
},
"proposedContentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The buyout per content the pending offer proposed, or null when none could be read"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "respond-to-renegotiation",
"title": "Accept or decline a price renegotiation",
"description": "Respond to a pending price renegotiation on an application — the other half of renegotiate-application-price. Accepting commits the proposed price (and, on a non-event campaign, accepts the application); declining ends it. Either way the brand is notified, so this is preview-then-confirm and the preview names the brand and the proposed price. The platform requires a pending renegotiation (renegotiation_not_pending) and refuses an accept on an already-started regular campaign (campaign_already_started); refusals are surfaced as-is. Target it by applicationId from list-applications.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"response"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"response": {
"enum": [
"ACCEPTED",
"DECLINED"
],
"type": "string",
"description": "Whether to accept the proposed price (commits it) or decline it."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application with a pending price renegotiation to respond to, from list-applications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"proposedContentUnitPrice",
"proposedPrice",
"response"
],
"properties": {
"response": {
"enum": [
"ACCEPTED",
"DECLINED"
],
"type": "string",
"description": "The response that was sent"
},
"performed": {
"type": "boolean",
"description": "Whether the response was sent (true) or this is a preview only (false)."
},
"applicationId": {
"type": "number",
"description": "The application the renegotiation was responded to on"
},
"proposedPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The total price the pending offer proposed, or null when none"
},
"proposedContentUnitPrice": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The buyout per content the pending offer proposed, or null when none could be read"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Resume a paused ongoing campaign so it appears to creators again — an outward-facing change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Refuses a campaign that is not paused. This is the mirror of pause-campaign. The platform enforces the rest; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the paused campaign to resume, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "resume-campaign",
"title": "Resume a paused campaign",
"description": "Resume a paused ongoing campaign so it appears to creators again — an outward-facing change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Refuses a campaign that is not paused. This is the mirror of pause-campaign. The platform enforces the rest; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the paused campaign to resume, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Finish polling a paid sourcing export that source-creators ordered but that was still running when it returned. Pass the exportId it gave you, plus the run's platform, maxFollowers and markets (source-creators names all of these); optionally its rubric and bias themes. It polls to completion and returns the exported creators, or pending if the export is still not ready (just run it again). The export is unscored — rank it with score-sourced-creators. A follow-up read that does not order or spend anything. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
biasTerms
The run's bias themes, from source-creators' plan; passed through to shape the scoring prompt, with no effect on which creators this export returns.
Clear enough to supply this argument.
exclude
Usernames to drop from the returned pool; omit to keep every exported creator.
Clear enough to supply this argument.
exportId
The export id source-creators returned while the export was still running.
Clear enough to supply this argument.
limit
How many creators to return, highest engagement first; the total pool size is reported separately.
Clear enough to supply this argument.
markets
The markets the run targeted, from source-creators.
Clear enough to supply this argument.
maxFollowers
The follower ceiling the run used, from source-creators.
Clear enough to supply this argument.
platform
The channel the run sourced, from source-creators.
Clear enough to supply this argument.
vibeRubric
The run's casting rubric, from source-creators' plan; passed through to shape the scoring prompt.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cost",
"creators",
"error",
"exportId",
"poolTotal",
"returned",
"scoredCount",
"status",
"validated"
],
"properties": {
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the export drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The export's cost when ready, or null while pending or failed"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the export failed, when status is failed; otherwise null"
},
"status": {
"enum": [
"failed",
"pending",
"ready"
],
"type": "string",
"description": "ready, pending (still running — run again), or failed"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100 — 0, since a fresh export is unscored until scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country)"
},
"reason": {
"type": "string",
"description": "The scorer's rationale — empty, since a fresh export is unscored until scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The exported creators, highest engagement first, capped at the limit"
},
"exportId": {
"type": "string",
"description": "The export id that was polled"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many exported creators passed validation, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many returned creators carry a fit score (0 for a fresh export), or null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "resume-sourcing-export",
"title": "Resume a sourcing export",
"description": "Finish polling a paid sourcing export that source-creators ordered but that was still running when it returned. Pass the exportId it gave you, plus the run's platform, maxFollowers and markets (source-creators names all of these); optionally its rubric and bias themes. It polls to completion and returns the exported creators, or pending if the export is still not ready (just run it again). The export is unscored — rank it with score-sourced-creators. A follow-up read that does not order or spend anything. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"exportId",
"markets",
"maxFollowers",
"platform"
],
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "How many creators to return, highest engagement first; the total pool size is reported separately."
},
"exclude": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Usernames to drop from the returned pool; omit to keep every exported creator."
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets the run targeted, from source-creators."
},
"exportId": {
"type": "string",
"description": "The export id source-creators returned while the export was still running."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "The channel the run sourced, from source-creators."
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "The run's bias themes, from source-creators' plan; passed through to shape the scoring prompt, with no effect on which creators this export returns."
},
"vibeRubric": {
"type": "string",
"default": "",
"description": "The run's casting rubric, from source-creators' plan; passed through to shape the scoring prompt."
},
"maxFollowers": {
"type": "integer",
"maximum": 9007199254740991,
"description": "The follower ceiling the run used, from source-creators.",
"exclusiveMinimum": 0
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"cost",
"creators",
"error",
"exportId",
"poolTotal",
"returned",
"scoredCount",
"status",
"validated"
],
"properties": {
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the export drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The export's cost when ready, or null while pending or failed"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the export failed, when status is failed; otherwise null"
},
"status": {
"enum": [
"failed",
"pending",
"ready"
],
"type": "string",
"description": "ready, pending (still running — run again), or failed"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100 — 0, since a fresh export is unscored until scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country)"
},
"reason": {
"type": "string",
"description": "The scorer's rationale — empty, since a fresh export is unscored until scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The exported creators, highest engagement first, capped at the limit"
},
"exportId": {
"type": "string",
"description": "The export id that was polled"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many exported creators passed validation, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many returned creators carry a fit score (0 for a fresh export), or null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Act on a creator's content submission: accept, request a revision, reject, override an AI/brand decision, or revert a published one. Accepting mirrors the web's one-click approve and applies directly; the others notify the creator or change published content, so they are preview-then-confirm and the preview names the brand. This works in manual mode (you decide, the AI only recommends) and in autopilot: on a fully automated campaign the AI decides and only staff can override, while on a semi-automated one the brand may override AI rejections. The platform enforces the rules (invalid_status_for_*, max_revisions_reached, cannot_reject_before_max_revisions, no_permission_to_override, submission_not_published) and its refusals are surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
What to do: accept (approve), request_revision (send back for changes), reject (turn down after the last revision), override (approve a rejected or revision-requested submission — staff, or a brand on a semi-automated autopilot campaign), or revert (take a published submission down — staff only).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign the submission belongs to, used to name the brand.
Clear enough to supply this argument.
caption
An edited caption to save when accepting or requesting a revision, if any.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
reason
The feedback shown to the creator — required for request_revision, reject and revert. Ignored on accept.
Clear enough to supply this argument.
submissionId
The id of the content submission to act on, from list-campaign-content.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"performed",
"submissionId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"submissionId": {
"type": "number",
"description": "The submission that was reviewed"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "review-content-submission",
"title": "Review a content submission",
"description": "Act on a creator's content submission: accept, request a revision, reject, override an AI/brand decision, or revert a published one. Accepting mirrors the web's one-click approve and applies directly; the others notify the creator or change published content, so they are preview-then-confirm and the preview names the brand. This works in manual mode (you decide, the AI only recommends) and in autopilot: on a fully automated campaign the AI decides and only staff can override, while on a semi-automated one the brand may override AI rejections. The platform enforces the rules (invalid_status_for_*, max_revisions_reached, cannot_reject_before_max_revisions, no_permission_to_override, submission_not_published) and its refusals are surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"campaignId",
"submissionId"
],
"properties": {
"action": {
"enum": [
"accept",
"override",
"reject",
"request_revision",
"revert"
],
"type": "string",
"description": "What to do: accept (approve), request_revision (send back for changes), reject (turn down after the last revision), override (approve a rejected or revision-requested submission — staff, or a brand on a semi-automated autopilot campaign), or revert (take a published submission down — staff only)."
},
"reason": {
"type": "string",
"description": "The feedback shown to the creator — required for request_revision, reject and revert. Ignored on accept."
},
"caption": {
"type": "string",
"description": "An edited caption to save when accepting or requesting a revision, if any."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the submission belongs to, used to name the brand."
},
"submissionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the content submission to act on, from list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"performed",
"submissionId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"submissionId": {
"type": "number",
"description": "The submission that was reviewed"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Produce a customer success review — of one agency account (pass agency: a name or id) or the whole book (omit it). Returns the step-by-step plan to carry out with the customer success tools: for one account its subscription and engagement, churn risk and raised markers, and notes; for the book, the summaries and the accounts that need attention. The tool equivalent of the customer-success-review prompt, so the review can be run from a plain request as well — including in clients that cannot invoke MCP prompts. Reads only; it never records a happiness score, status, or note unless the user asks.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
agency
A brand or agency name, or an agency id, to focus the review on one account. Omit to review the whole book.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "review-customer-success",
"title": "Review a customer success account",
"description": "Produce a customer success review — of one agency account (pass agency: a name or id) or the whole book (omit it). Returns the step-by-step plan to carry out with the customer success tools: for one account its subscription and engagement, churn risk and raised markers, and notes; for the book, the summaries and the accounts that need attention. The tool equivalent of the customer-success-review prompt, so the review can be run from a plain request as well — including in clients that cannot invoke MCP prompts. Reads only; it never records a happiness score, status, or note unless the user asks.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"agency": {
"type": "string",
"description": "A brand or agency name, or an agency id, to focus the review on one account. Omit to review the whole book."
}
}
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Act on a creator's submitted UGC video: approve it or request a revision. Approving mirrors the web's one-click action and applies directly; requesting a revision notifies the creator, so it is preview-then-confirm and the preview names the brand. Target it by applicationId + ugcContentId (from list-ugc-media). The platform requires a video to be submitted (and in review, for a revision) and returns its refusals (no_ugc_media_for_application, no_ugc_media_in_review_for_application, action_not_allowed) as-is; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
Whether to approve the creator's video or request a revision.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationId
The id of the UGC application, from list-ugc-media or list-campaign-content.
Clear enough to supply this argument.
campaignId
The id of the campaign the video belongs to, used to name the brand.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
reason
The reason shown to the creator when requesting a revision. Ignored on approve.
Clear enough to supply this argument.
ugcContentId
The id of the video brief to act on, from list-ugc-media.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"applicationId",
"performed",
"ugcContentId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"ugcContentId": {
"type": "number",
"description": "The video brief that was acted on"
},
"applicationId": {
"type": "number",
"description": "The application the video belongs to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "review-ugc-media",
"title": "Approve or request a revision on a UGC video",
"description": "Act on a creator's submitted UGC video: approve it or request a revision. Approving mirrors the web's one-click action and applies directly; requesting a revision notifies the creator, so it is preview-then-confirm and the preview names the brand. Target it by applicationId + ugcContentId (from list-ugc-media). The platform requires a video to be submitted (and in review, for a revision) and returns its refusals (no_ugc_media_for_application, no_ugc_media_in_review_for_application, action_not_allowed) as-is; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"applicationId",
"campaignId",
"ugcContentId"
],
"properties": {
"action": {
"enum": [
"approve",
"request-revision"
],
"type": "string",
"description": "Whether to approve the creator's video or request a revision."
},
"reason": {
"type": "string",
"description": "The reason shown to the creator when requesting a revision. Ignored on approve."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the video belongs to, used to name the brand."
},
"ugcContentId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the video brief to act on, from list-ugc-media."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the UGC application, from list-ugc-media or list-campaign-content."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"action",
"applicationId",
"performed",
"ugcContentId"
],
"properties": {
"action": {
"type": "string",
"description": "The action that was applied"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"ugcContentId": {
"type": "number",
"description": "The video brief that was acted on"
},
"applicationId": {
"type": "number",
"description": "The application the video belongs to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Accept or reject a creator's submitted UGC verification video — the admin decision on the influencer edit page. It reaches the real creator by push notification and email, so it is preview-then-confirm and names the creator; the preview also shows the advisory AI recommendation and suggested rejection reason. Target it by the verificationId (from list-ugc-verifications) and the creator's influencerId. Only a pending verification can be acted on — the platform refuses otherwise (status_cannot_be_changed, status_is_required) and gates it to admins; refusals are surfaced as-is. The AI only advises; this decision is the human one.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
influencerId
The creator's influencer profile id, to name them and find the verification.
Clear enough to supply this argument.
rejectedReason
The reason shown to the creator when rejecting. Used only when status is rejected.
Clear enough to supply this argument.
status
Whether to accept or reject the verification.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
verificationId
The UGC verification id to act on, from list-ugc-verifications.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId",
"performed",
"status",
"verification"
],
"properties": {
"status": {
"enum": [
"accepted",
"rejected"
],
"type": "string",
"description": "The decision that was sent"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"influencerId": {
"type": "number",
"description": "The creator whose verification was reviewed"
},
"verification": {
"anyOf": [
{
"type": "object",
"required": [
"aiEvaluation",
"autoRejected",
"created",
"id",
"lengthSeconds",
"mediaUrl",
"modified",
"rejectionReason",
"status",
"thumbnailUrl",
"userId"
],
"properties": {
"id": {
"type": "number",
"description": "The UGC verification id — pass to review-ugc-verification to accept or reject it"
},
"status": {
"enum": [
"accepted",
"pending",
"rejected"
],
"type": "string",
"description": "The verification's status — only a pending one can be accepted or rejected"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser) who submitted the verification"
},
"created": {
"type": "string",
"description": "When the verification was submitted (ISO 8601)"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the verification video, or null"
},
"modified": {
"type": "string",
"description": "When the verification was last changed (ISO 8601)"
},
"aiEvaluation": {
"type": "object",
"required": [
"checks",
"detail",
"recommendation",
"rubricVersion",
"status",
"suggestedReason"
],
"properties": {
"checks": {
"type": "array",
"items": {
"type": "object",
"required": [
"confidence",
"id",
"passed",
"reason"
],
"properties": {
"id": {
"type": "string",
"description": "The check's id, e.g. not_ai_voice, brand_safety_ok, strong_hook"
},
"passed": {
"type": "boolean",
"description": "Whether the check passed"
},
"reason": {
"type": "string",
"description": "The AI's reasoning, in the reviewer's language"
},
"confidence": {
"type": "number",
"description": "The AI's confidence in this check, 0–1"
}
},
"additionalProperties": false
},
"description": "The per-check results — populated only when status is succeeded, otherwise empty"
},
"detail": {
"type": "string",
"description": "A short detail code from the evaluation"
},
"status": {
"enum": [
"failed",
"not_started",
"running",
"skipped",
"succeeded"
],
"type": "string",
"description": "The AI evaluation's state; checks and recommendation are present only when succeeded"
},
"rubricVersion": {
"type": "string",
"description": "The rubric version the evaluation used"
},
"recommendation": {
"enum": [
"",
"APPROVE",
"REJECT"
],
"type": "string",
"description": "The AI's advisory recommendation (empty until the evaluation succeeds) — it never acts on its own"
},
"suggestedReason": {
"type": "string",
"description": "Suggested rejection copy in the creator's language, or empty"
}
},
"description": "The advisory AI rubric evaluation attached to the verification",
"additionalProperties": false
},
"autoRejected": {
"type": "boolean",
"description": "Whether the AI auto-rejected this verification"
},
"thumbnailUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the video thumbnail, or null"
},
"lengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The video's length in seconds, or null"
},
"rejectionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason the verification was rejected, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The updated verification, or null on a preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "review-ugc-verification",
"title": "Accept or reject a creator's UGC verification",
"description": "Accept or reject a creator's submitted UGC verification video — the admin decision on the influencer edit page. It reaches the real creator by push notification and email, so it is preview-then-confirm and names the creator; the preview also shows the advisory AI recommendation and suggested rejection reason. Target it by the verificationId (from list-ugc-verifications) and the creator's influencerId. Only a pending verification can be acted on — the platform refuses otherwise (status_cannot_be_changed, status_is_required) and gates it to admins; refusals are surfaced as-is. The AI only advises; this decision is the human one.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId",
"status",
"verificationId"
],
"properties": {
"status": {
"enum": [
"accepted",
"rejected"
],
"type": "string",
"description": "Whether to accept or reject the verification."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"influencerId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's influencer profile id, to name them and find the verification."
},
"rejectedReason": {
"type": "string",
"description": "The reason shown to the creator when rejecting. Used only when status is rejected."
},
"verificationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The UGC verification id to act on, from list-ugc-verifications."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId",
"performed",
"status",
"verification"
],
"properties": {
"status": {
"enum": [
"accepted",
"rejected"
],
"type": "string",
"description": "The decision that was sent"
},
"performed": {
"type": "boolean",
"description": "Whether the review was applied (true) or this is a preview only (false)."
},
"influencerId": {
"type": "number",
"description": "The creator whose verification was reviewed"
},
"verification": {
"anyOf": [
{
"type": "object",
"required": [
"aiEvaluation",
"autoRejected",
"created",
"id",
"lengthSeconds",
"mediaUrl",
"modified",
"rejectionReason",
"status",
"thumbnailUrl",
"userId"
],
"properties": {
"id": {
"type": "number",
"description": "The UGC verification id — pass to review-ugc-verification to accept or reject it"
},
"status": {
"enum": [
"accepted",
"pending",
"rejected"
],
"type": "string",
"description": "The verification's status — only a pending one can be accepted or rejected"
},
"userId": {
"type": "number",
"description": "The creator's user id (BaseUser) who submitted the verification"
},
"created": {
"type": "string",
"description": "When the verification was submitted (ISO 8601)"
},
"mediaUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the verification video, or null"
},
"modified": {
"type": "string",
"description": "When the verification was last changed (ISO 8601)"
},
"aiEvaluation": {
"type": "object",
"required": [
"checks",
"detail",
"recommendation",
"rubricVersion",
"status",
"suggestedReason"
],
"properties": {
"checks": {
"type": "array",
"items": {
"type": "object",
"required": [
"confidence",
"id",
"passed",
"reason"
],
"properties": {
"id": {
"type": "string",
"description": "The check's id, e.g. not_ai_voice, brand_safety_ok, strong_hook"
},
"passed": {
"type": "boolean",
"description": "Whether the check passed"
},
"reason": {
"type": "string",
"description": "The AI's reasoning, in the reviewer's language"
},
"confidence": {
"type": "number",
"description": "The AI's confidence in this check, 0–1"
}
},
"additionalProperties": false
},
"description": "The per-check results — populated only when status is succeeded, otherwise empty"
},
"detail": {
"type": "string",
"description": "A short detail code from the evaluation"
},
"status": {
"enum": [
"failed",
"not_started",
"running",
"skipped",
"succeeded"
],
"type": "string",
"description": "The AI evaluation's state; checks and recommendation are present only when succeeded"
},
"rubricVersion": {
"type": "string",
"description": "The rubric version the evaluation used"
},
"recommendation": {
"enum": [
"",
"APPROVE",
"REJECT"
],
"type": "string",
"description": "The AI's advisory recommendation (empty until the evaluation succeeds) — it never acts on its own"
},
"suggestedReason": {
"type": "string",
"description": "Suggested rejection copy in the creator's language, or empty"
}
},
"description": "The advisory AI rubric evaluation attached to the verification",
"additionalProperties": false
},
"autoRejected": {
"type": "boolean",
"description": "Whether the AI auto-rejected this verification"
},
"thumbnailUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the video thumbnail, or null"
},
"lengthSeconds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The video's length in seconds, or null"
},
"rejectionReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The reason the verification was rejected, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The updated verification, or null on a preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Revoke an agency's pending invitation, identified by the invited email. It is preview-then-confirm, mirroring the web app's confirmation; the preview names the agency. Target the agency by agencyId; no scope needs to be selected. Only a pending invitation can be revoked — the platform refuses one already accepted or rejected, or a missing one; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of the agency the invitation is on, from list-agencies, list-brands or list-agency-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
email
The email address of the pending invitation to revoke, from list-agency-members.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"performed",
"revoked"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was revoked"
},
"revoked": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address whose invitation was revoked"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The revoked invitation once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was revoked (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "revoke-agency-invitation",
"title": "Revoke an agency invitation",
"description": "Revoke an agency's pending invitation, identified by the invited email. It is preview-then-confirm, mirroring the web app's confirmation; the preview names the agency. Target the agency by agencyId; no scope needs to be selected. Only a pending invitation can be revoked — the platform refuses one already accepted or rejected, or a missing one; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address of the pending invitation to revoke, from list-agency-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency the invitation is on, from list-agencies, list-brands or list-agency-members."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agency",
"performed",
"revoked"
],
"properties": {
"agency": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The agency, or null when the name was ambiguous and nothing was revoked"
},
"revoked": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address whose invitation was revoked"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The revoked invitation once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was revoked (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Revoke a brand's pending invitation, identified by the invited email. It is preview-then-confirm, mirroring the web app's confirmation; the preview names the brand. Target the brand by brandId; no brand needs to be selected. Only a pending invitation can be revoked — the platform refuses one already accepted or rejected, or a missing one; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand the invitation is on, from list-brands, get-brand or list-brand-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
email
The email address of the pending invitation to revoke, from list-brand-members.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"performed",
"revoked"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was revoked"
},
"revoked": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address whose invitation was revoked"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The revoked invitation once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was revoked (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "revoke-brand-invitation",
"title": "Revoke a brand invitation",
"description": "Revoke a brand's pending invitation, identified by the invited email. It is preview-then-confirm, mirroring the web app's confirmation; the preview names the brand. Target the brand by brandId; no brand needs to be selected. Only a pending invitation can be revoked — the platform refuses one already accepted or rejected, or a missing one; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address of the pending invitation to revoke, from list-brand-members."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand the invitation is on, from list-brands, get-brand or list-brand-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"performed",
"revoked"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was revoked"
},
"revoked": {
"anyOf": [
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The email address whose invitation was revoked"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The revoked invitation once confirmed, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the invitation was revoked (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Run one read-only SQL query against the Refluenced platform database and return the rows — the second step of the open-data fallback, for a data question no other tool covers, or one a tool answers only in part because it does not expose the field the question turns on (for example a campaign's dates). Call describe-data-schema first to get exact table and column names, then pass a single SELECT (or WITH … SELECT) here. Admin-only (Refluenced staff) and read-only; it names no brand and changes nothing — the query runs inside a READ ONLY transaction with a statement timeout, and the result is capped on rows. Sensitive tables and columns are masked and any query naming one is refused. A SQL error is surfaced verbatim so the query can be corrected and run again.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
sql
A single read-only SELECT (or WITH … SELECT) query. Call describe-data-schema first for exact table and column names — do not guess them. Sensitive tables and columns (passwords, tokens, sessions) are masked and any query naming one is refused. The result is capped, so aggregate (COUNT/SUM/AVG/GROUP BY) rather than selecting raw rows whenever the question allows.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"columns",
"rowCount",
"rows",
"truncated"
],
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"description": "The result rows, each a column-name → value object"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The result column names, in order"
},
"rowCount": {
"type": "number",
"description": "How many rows are returned in this response (after the row cap)"
},
"truncated": {
"type": "boolean",
"description": "True when the result hit the row cap and more rows exist than are shown"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "run-data-query",
"title": "Run a data query",
"description": "Run one read-only SQL query against the Refluenced platform database and return the rows — the second step of the open-data fallback, for a data question no other tool covers, or one a tool answers only in part because it does not expose the field the question turns on (for example a campaign's dates). Call describe-data-schema first to get exact table and column names, then pass a single SELECT (or WITH … SELECT) here. Admin-only (Refluenced staff) and read-only; it names no brand and changes nothing — the query runs inside a READ ONLY transaction with a statement timeout, and the result is capped on rows. Sensitive tables and columns are masked and any query naming one is refused. A SQL error is surfaced verbatim so the query can be corrected and run again.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"sql"
],
"properties": {
"sql": {
"type": "string",
"description": "A single read-only SELECT (or WITH … SELECT) query. Call describe-data-schema first for exact table and column names — do not guess them. Sensitive tables and columns (passwords, tokens, sessions) are masked and any query naming one is refused. The result is capped, so aggregate (COUNT/SUM/AVG/GROUP BY) rather than selecting raw rows whenever the question allows."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"columns",
"rowCount",
"rows",
"truncated"
],
"properties": {
"rows": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"description": "The result rows, each a column-name → value object"
},
"columns": {
"type": "array",
"items": {
"type": "string"
},
"description": "The result column names, in order"
},
"rowCount": {
"type": "number",
"description": "How many rows are returned in this response (after the row cap)"
},
"truncated": {
"type": "boolean",
"description": "True when the result hit the row cap and more rows exist than are shown"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Save a named influencer-search filter preset — followers, engagement, median views, countries, gender, interests (by name), channel, and a free-text vibe — for reuse against the network search, owned by a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies), one scope, not both. The name must be unique within the owner, and the platform refuses a preset whose filters duplicate an existing one (duplicate_filter_params), surfaced as-is. Applies directly, as the web app saves directly.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies, to own the preset. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyName
The agency's name, from list-agencies, to state the scope back.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of a brand, from list-brands, to own the preset. Provide a brand or an agency, not both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandName
The brand's name, from list-brands, to state the scope back.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
name
The name for the preset. Must be unique within the owning brand or agency.
Clear enough to supply this argument.
channel
Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel.
Clear enough to supply this argument.
countries
Only members based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
engagementMax
Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
engagementMin
Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%).
Clear enough to supply this argument.
followersMax
Only members with at most this many followers.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
followersMin
Only members with at least this many followers.
Clear enough to supply this argument.
gender
Only members of this gender.
Clear enough to supply this argument.
interests
Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests).
Clear enough to supply this argument.
medianViewsMax
Only members with at most this many median views.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
medianViewsMin
Only members with at least this many median views.
Clear enough to supply this argument.
ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
punishmentType
Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins.
Clear enough to supply this argument.
search
Filter members by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"preset"
],
"properties": {
"preset": {
"type": "object",
"required": [
"agencyId",
"companyId",
"created",
"filterParams",
"groups",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset's id — pass to edit-filter-preset or delete-filter-preset"
},
"name": {
"type": "string",
"description": "The preset's name"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
}
},
"additionalProperties": false
},
"description": "The groups referenced by the preset's group_ids filter, resolved to names (empty when none)"
},
"created": {
"type": "string",
"description": "When the preset was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The agency that owns the preset, or null when it belongs to a brand"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand (company) that owns the preset, or null when it belongs to an agency"
},
"filterParams": {
"type": "object",
"description": "The stored filter set, as the platform's own search params (e.g. type, influencer_country, followers_start, engagement_start, influencer_interests) — the same vocabulary save-filter-preset builds from friendly fields.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"description": "The saved preset",
"additionalProperties": false
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "save-filter-preset",
"title": "Save an influencer-filter preset",
"description": "Save a named influencer-search filter preset — followers, engagement, median views, countries, gender, interests (by name), channel, and a free-text vibe — for reuse against the network search, owned by a brand (brandId + brandName, from list-brands) or an agency (agencyId + agencyName, from list-agencies), one scope, not both. The name must be unique within the owner, and the platform refuses a preset whose filters duplicate an existing one (duplicate_filter_params), surfaced as-is. Applies directly, as the web app saves directly.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The name for the preset. Must be unique within the owning brand or agency."
},
"vibe": {
"type": "string",
"description": "Rank members by how well they match this free-text description, e.g. 'sustainable fashion creators'."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only members of this gender."
},
"search": {
"type": "string",
"description": "Filter members by name, Instagram handle or TikTok handle."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of a brand, from list-brands, to own the preset. Provide a brand or an agency, not both."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel the follower/engagement/median-view numbers refer to, and the channel a vibe search ranks on. When omitted, they are matched against the platform's default channel."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies, to own the preset. Provide a brand or an agency, not both."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"brandName": {
"type": "string",
"description": "The brand's name, from list-brands, to state the scope back."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only members in these niches, by name, e.g. ['Food', 'Fitness']. Each name must match a niche on the platform's interest list; if any don't, the call is refused naming them (check names with list-interests)."
},
"agencyName": {
"type": "string",
"description": "The agency's name, from list-agencies, to state the scope back."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe: how strict the vibe match must be — a lower value matches more loosely, a higher value more strictly. Ignored when vibe is not set."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many followers."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"engagementMax": {
"type": "number",
"description": "Only members with at most this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"engagementMin": {
"type": "number",
"description": "Only members with at least this engagement rate, given as a percentage (e.g. 3 means 3%)."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only members with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only members currently carrying this punishment. The platform ignores it for non-admins."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"preset"
],
"properties": {
"preset": {
"type": "object",
"required": [
"agencyId",
"companyId",
"created",
"filterParams",
"groups",
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The preset's id — pass to edit-filter-preset or delete-filter-preset"
},
"name": {
"type": "string",
"description": "The preset's name"
},
"groups": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The group's id"
},
"name": {
"type": "string",
"description": "The group's name"
}
},
"additionalProperties": false
},
"description": "The groups referenced by the preset's group_ids filter, resolved to names (empty when none)"
},
"created": {
"type": "string",
"description": "When the preset was created (ISO 8601)"
},
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The agency that owns the preset, or null when it belongs to a brand"
},
"companyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The brand (company) that owns the preset, or null when it belongs to an agency"
},
"filterParams": {
"type": "object",
"description": "The stored filter set, as the platform's own search params (e.g. type, influencer_country, followers_start, engagement_start, influencer_interests) — the same vocabulary save-filter-preset builds from friendly fields.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"description": "The saved preset",
"additionalProperties": false
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Rank a list of creators against a brand's casting rubric using the standalone sourcing tool's scorer — the same 0-100 fit scoring source-creators applies. Give it the creators (a username each, plus a bio and interests where you have them — they sharpen the scoring), the run's vibeRubric, and optionally its biasTerms; all three come from source-creators or get-sourcing-project. It returns each creator's fit score and rationale, highest first. This spends a small amount on Gemini (reported), but orders no export. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
biasTerms
Bio themes to favour, from a run's plan (source-creators or get-sourcing-project return these).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
creators › items › brandAffinity
Brands the creator's audience skews toward, if known
Clear enough to supply this argument.
creators › items › description
The creator's bio — the strongest fit signal the scorer has
Clear enough to supply this argument.
creators › items › engagementRate
Engagement rate as a percentage, if known
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
creators › items › followers
Follower count, if known
Clear enough to supply this argument.
creators › items › fullname
The creator's display name, if known
Clear enough to supply this argument.
creators › items › interests
The creator's content interests, if known
Clear enough to supply this argument.
creators › items › username
The creator's handle (with or without @) — scores are keyed to this
Clear enough to supply this argument.
vibeRubric
The casting rubric to score against, from a run's plan (source-creators or get-sourcing-project).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creators",
"geminiUsd",
"returned",
"unscored"
],
"properties": {
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"engagementRate",
"followers",
"fullname",
"reason",
"score",
"username"
],
"properties": {
"score": {
"type": "number",
"description": "Fit score 0-100"
},
"reason": {
"type": "string",
"description": "The scorer's one-line rationale"
},
"fullname": {
"type": "string",
"description": "Display name, echoed from the input"
},
"username": {
"type": "string",
"description": "The creator's handle (bare, without @)"
},
"followers": {
"type": "number",
"description": "Follower count, echoed from the input (0 when not given)"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage, echoed from the input (0 when not given)"
}
},
"additionalProperties": false
},
"description": "The scored creators, highest fit score first"
},
"returned": {
"type": "number",
"description": "How many creators were scored"
},
"unscored": {
"type": "number",
"description": "How many input creators the scorer returned no score for"
},
"geminiUsd": {
"type": "number",
"description": "What the scoring cost in Gemini dollars"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "score-sourced-creators",
"title": "Score sourced creators",
"description": "Rank a list of creators against a brand's casting rubric using the standalone sourcing tool's scorer — the same 0-100 fit scoring source-creators applies. Give it the creators (a username each, plus a bio and interests where you have them — they sharpen the scoring), the run's vibeRubric, and optionally its biasTerms; all three come from source-creators or get-sourcing-project. It returns each creator's fit score and rationale, highest first. This spends a small amount on Gemini (reported), but orders no export. Reaches a separate service, so an auth error means the sourcing cookie is missing or expired.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creators",
"vibeRubric"
],
"properties": {
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"username"
],
"properties": {
"fullname": {
"type": "string",
"description": "The creator's display name, if known"
},
"username": {
"type": "string",
"description": "The creator's handle (with or without @) — scores are keyed to this"
},
"followers": {
"type": "number",
"description": "Follower count, if known"
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "The creator's content interests, if known"
},
"description": {
"type": "string",
"description": "The creator's bio — the strongest fit signal the scorer has"
},
"brandAffinity": {
"type": "array",
"items": {
"type": "string"
},
"description": "Brands the creator's audience skews toward, if known"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage, if known"
}
}
},
"maxItems": 200,
"minItems": 1,
"description": "The creators to score. Pass at least a username each; a bio and interests make the scoring far better."
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Bio themes to favour, from a run's plan (source-creators or get-sourcing-project return these)."
},
"vibeRubric": {
"type": "string",
"description": "The casting rubric to score against, from a run's plan (source-creators or get-sourcing-project)."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creators",
"geminiUsd",
"returned",
"unscored"
],
"properties": {
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"engagementRate",
"followers",
"fullname",
"reason",
"score",
"username"
],
"properties": {
"score": {
"type": "number",
"description": "Fit score 0-100"
},
"reason": {
"type": "string",
"description": "The scorer's one-line rationale"
},
"fullname": {
"type": "string",
"description": "Display name, echoed from the input"
},
"username": {
"type": "string",
"description": "The creator's handle (bare, without @)"
},
"followers": {
"type": "number",
"description": "Follower count, echoed from the input (0 when not given)"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage, echoed from the input (0 when not given)"
}
},
"additionalProperties": false
},
"description": "The scored creators, highest fit score first"
},
"returned": {
"type": "number",
"description": "How many creators were scored"
},
"unscored": {
"type": "number",
"description": "How many input creators the scorer returned no score for"
},
"geminiUsd": {
"type": "number",
"description": "What the scoring cost in Gemini dollars"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Find campaigns across every brand by title (campaignName) or by brand/company name (brandName); pass at least one. Results span all brands, so each carries the company that owns it — use its companyId with select-brand, or its id with get-campaign. Only active, published campaigns are searched; drafts are not covered.
The description explains the capability, when to use it, and what to expect.
Inputs91/100
Input documentation gives an agent enough context to populate the arguments.
brandName
Narrow to campaigns whose brand or company name contains this text.
Clear enough to supply this argument.
campaignName
Narrow to campaigns whose title contains this text.
Clear enough to supply this argument.
page
Which page of results to return; request the next page while hasMore is true.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"brandName",
"companyId",
"companyName",
"deadline",
"id",
"instagram",
"locations",
"status",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id, passed to get-campaign for detail"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"title": {
"type": "string",
"description": "The campaign's title"
},
"status": {
"type": "string",
"description": "The campaign's status, e.g. planned, open, preparation, active or complete"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's application deadline, or null when unset"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's brand label, or null when unset"
},
"companyId": {
"type": "number",
"description": "The id of the company that owns the campaign, for select-brand"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"companyName": {
"type": "string",
"description": "The name of the company that owns the campaign"
}
},
"additionalProperties": false
},
"description": "The campaigns matching the search across every brand"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "search-campaigns",
"title": "Search campaigns",
"description": "Find campaigns across every brand by title (campaignName) or by brand/company name (brandName); pass at least one. Results span all brands, so each carries the company that owns it — use its companyId with select-brand, or its id with get-campaign. Only active, published campaigns are searched; drafts are not covered.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return; request the next page while hasMore is true."
},
"brandName": {
"type": "string",
"description": "Narrow to campaigns whose brand or company name contains this text."
},
"campaignName": {
"type": "string",
"description": "Narrow to campaigns whose title contains this text."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaigns",
"count",
"hasMore",
"page"
],
"properties": {
"page": {
"type": "number",
"description": "The page of results returned"
},
"count": {
"type": "number",
"description": "Total campaigns matching the query across every page"
},
"hasMore": {
"type": "boolean",
"description": "Whether further pages exist beyond this one"
},
"campaigns": {
"type": "array",
"items": {
"type": "object",
"required": [
"brandName",
"companyId",
"companyName",
"deadline",
"id",
"instagram",
"locations",
"status",
"tiktok",
"title",
"ugc",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id, passed to get-campaign for detail"
},
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"title": {
"type": "string",
"description": "The campaign's title"
},
"status": {
"type": "string",
"description": "The campaign's status, e.g. planned, open, preparation, active or complete"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's application deadline, or null when unset"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's brand label, or null when unset"
},
"companyId": {
"type": "number",
"description": "The id of the company that owns the campaign, for select-brand"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"locations": {
"type": "string",
"description": "The location(s) the campaign targets"
},
"companyName": {
"type": "string",
"description": "The name of the company that owns the campaign"
}
},
"additionalProperties": false
},
"description": "The campaigns matching the search across every brand"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Search Refluenced's whole influencer network to find creators to invite to a campaign. Filter by channel, niche (interest names like 'Food'), country, gender, follower and engagement ranges, or pass a vibe like 'sustainable fashion creators' to rank by semantic match. Admins can also filter by punishmentType to find disciplined creators (e.g. banned or un-verified ones). Returns each creator with their stats and a uuid to invite them with. Searches globally — no brand needs to be selected, though an optional brand can be passed for liked/worked-with context.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
channel
Which channel to search on — decides whether followers/engagement mean Instagram or TikTok.
Clear enough to supply this argument.
companyId
Optional brand id (from list-brands) to search in that brand's context — annotates who it has liked or worked with. Not required; the network is searchable globally.
Clear enough to supply this argument.
countries
Only influencers based in these countries, e.g. ['Switzerland', 'Germany'].
Clear enough to supply this argument.
cutoffValue
Only with vibe (ignored otherwise): how strict the semantic match must be, from loosest to strictest.
Clear enough to supply this argument.
engagementMax
Only influencers with at most this engagement rate, on the same scale as the engagement figures this search returns for each creator.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
engagementMin
Only influencers with at least this engagement rate, on the same scale as the engagement figures this search returns for each creator.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
followersMax
Only influencers with at most this many followers.
Clear enough to supply this argument.
followersMin
Only influencers with at least this many followers.
Clear enough to supply this argument.
gender
Only influencers of this gender.
Clear enough to supply this argument.
interests
Only influencers in these niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back.
Clear enough to supply this argument.
limit
How many influencers to return per page.
Clear enough to supply this argument.
medianViewsMax
Only influencers with at most this many median views.
Clear enough to supply this argument.
medianViewsMin
Only influencers with at least this many median views.
Clear enough to supply this argument.
ordering
How to sort, highest first (ignored when vibe is set, which sorts by match).
Clear enough to supply this argument.
page
Which page of results to return, starting at 1.
Clear enough to supply this argument.
punishmentType
Admin-only: only creators currently carrying this punishment — a ban type (PERMANENT_BAN/TIMED_BAN/PROBATION) matches their active standing, an un-verify type (UN_VERIFIED_INSTAGRAM/TIKTOK/UGC) matches that channel's flag. The platform ignores it for non-admins. It takes one value, so to find every banned creator query PERMANENT_BAN and TIMED_BAN separately.
Clear enough to supply this argument.
search
Filter by name, Instagram handle or TikTok handle.
Clear enough to supply this argument.
vibe
Rank influencers by how well they match this free-text description, e.g. 'sustainable fashion creators'. Uses semantic search.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"count",
"hasMore",
"influencers",
"unmatchedInterests"
],
"properties": {
"count": {
"type": "number",
"description": "How many influencers match in total, across all pages"
},
"channel": {
"type": "string",
"description": "The channel that was searched"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"vibeScore"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"vibeScore": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Semantic match score, 0 (worst) to 1 (best), when the results were ranked by a vibe. null when no vibe was given — in that case the list order itself carries the ranking."
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The influencers on this page, in the requested order"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "search-influencer-network",
"title": "Search the influencer network",
"description": "Search Refluenced's whole influencer network to find creators to invite to a campaign. Filter by channel, niche (interest names like 'Food'), country, gender, follower and engagement ranges, or pass a vibe like 'sustainable fashion creators' to rank by semantic match. Admins can also filter by punishmentType to find disciplined creators (e.g. banned or un-verified ones). Returns each creator with their stats and a uuid to invite them with. Searches globally — no brand needs to be selected, though an optional brand can be passed for liked/worked-with context.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"vibe": {
"type": "string",
"description": "Rank influencers by how well they match this free-text description, e.g. 'sustainable fashion creators'. Uses semantic search."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many influencers to return per page."
},
"gender": {
"enum": [
"female",
"male"
],
"type": "string",
"description": "Only influencers of this gender."
},
"search": {
"type": "string",
"description": "Filter by name, Instagram handle or TikTok handle."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"default": "instagram",
"description": "Which channel to search on — decides whether followers/engagement mean Instagram or TikTok."
},
"ordering": {
"enum": [
"engagement",
"followers",
"median_views",
"rating",
"recent"
],
"type": "string",
"description": "How to sort, highest first (ignored when vibe is set, which sorts by match)."
},
"companyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Optional brand id (from list-brands) to search in that brand's context — annotates who it has liked or worked with. Not required; the network is searchable globally."
},
"countries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only influencers based in these countries, e.g. ['Switzerland', 'Germany']."
},
"interests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only influencers in these niches, by name, e.g. ['Food', 'Fitness']. Names are matched against the platform's interest list; any that don't match are reported back."
},
"cutoffValue": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Only with vibe (ignored otherwise): how strict the semantic match must be, from loosest to strictest."
},
"followersMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at most this many followers."
},
"followersMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at least this many followers."
},
"engagementMax": {
"type": "number",
"description": "Only influencers with at most this engagement rate, on the same scale as the engagement figures this search returns for each creator."
},
"engagementMin": {
"type": "number",
"description": "Only influencers with at least this engagement rate, on the same scale as the engagement figures this search returns for each creator."
},
"medianViewsMax": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at most this many median views."
},
"medianViewsMin": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only influencers with at least this many median views."
},
"punishmentType": {
"enum": [
"PERMANENT_BAN",
"PROBATION",
"TIMED_BAN",
"UN_VERIFIED_INSTAGRAM",
"UN_VERIFIED_TIKTOK",
"UN_VERIFIED_UGC"
],
"type": "string",
"description": "Admin-only: only creators currently carrying this punishment — a ban type (PERMANENT_BAN/TIMED_BAN/PROBATION) matches their active standing, an un-verify type (UN_VERIFIED_INSTAGRAM/TIKTOK/UGC) matches that channel's flag. The platform ignores it for non-admins. It takes one value, so to find every banned creator query PERMANENT_BAN and TIMED_BAN separately."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"count",
"hasMore",
"influencers",
"unmatchedInterests"
],
"properties": {
"count": {
"type": "number",
"description": "How many influencers match in total, across all pages"
},
"channel": {
"type": "string",
"description": "The channel that was searched"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages of results exist beyond this one"
},
"influencers": {
"type": "array",
"items": {
"type": "object",
"required": [
"city",
"country",
"engagement",
"followers",
"isBrandAmbassador",
"isInstagramPro",
"isTiktokPro",
"medianViews",
"name",
"numberOfOrders",
"numberOfRatings",
"pictureUrl",
"profileUrl",
"qualityRating",
"rating",
"reliabilityRating",
"tiktokEngagement",
"tiktokFollowers",
"tiktokMedianViews",
"tiktokUsername",
"ugcVerified",
"userId",
"username",
"uuid",
"vibeScore"
],
"properties": {
"city": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's city, or null"
},
"name": {
"type": "string",
"description": "The influencer's display name, falling back to their username"
},
"uuid": {
"type": "number",
"description": "The influencer's profile id, used only to build the profile URL — not the id for invites or punishments"
},
"rating": {
"type": "number",
"description": "Overall rating on a 0–5 scale (0 when unrated)"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id. This is the id to pass to invite-creators and to the punishment tools (issue-punishment, list-punishments) — NOT the uuid below."
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's country, or null"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's Instagram handle, or null"
},
"followers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram followers, or null when unknown"
},
"vibeScore": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Semantic match score, 0 (worst) to 1 (best), when the results were ranked by a vibe. null when no vibe was given — in that case the list order itself carries the ranking."
},
"engagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Instagram engagement rate, or null when unknown"
},
"pictureUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's profile picture, or null"
},
"profileUrl": {
"type": "string",
"description": "The influencer's full profile page in the Refluenced web app"
},
"isTiktokPro": {
"type": "boolean",
"description": "Whether the influencer is a verified TikTok pro"
},
"medianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median Instagram views, or null when unknown"
},
"ugcVerified": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the creator is UGC-verified — the eligibility signal for UGC campaigns. null when the source endpoint does not report it."
},
"qualityRating": {
"type": "number",
"description": "Average quality rating on a 0–5 scale (0 when unrated)"
},
"isInstagramPro": {
"type": "boolean",
"description": "Whether the influencer is a verified Instagram pro"
},
"numberOfOrders": {
"type": "number",
"description": "How many campaigns the influencer has completed"
},
"tiktokUsername": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The influencer's TikTok handle, or null"
},
"numberOfRatings": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many times the influencer has been rated, or null"
},
"tiktokFollowers": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok followers, or null when unknown"
},
"tiktokEngagement": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok engagement rate, or null when unknown"
},
"isBrandAmbassador": {
"type": "boolean",
"description": "Whether the influencer is a brand ambassador"
},
"reliabilityRating": {
"type": "number",
"description": "Average reliability rating on a 0–5 scale (0 when unrated)"
},
"tiktokMedianViews": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Median TikTok views, or null when unknown"
}
},
"additionalProperties": false
},
"description": "The influencers on this page, in the requested order"
},
"unmatchedInterests": {
"type": "array",
"items": {
"type": "string"
},
"description": "Any interest names that did not match a known niche and were therefore not applied as a filter"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Rank the accounts creators tag or mention most, across the platform's harvested social content — a discovery companion to search-influencer-network, for spotting frequently-mentioned brands and creators. Optionally narrow by a search substring or to one channel (Instagram or TikTok); results come back most-mentioned first. Present them as a chart. A read; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many accounts to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Limit to one channel; omit to rank across both Instagram and TikTok.
Clear enough to supply this argument.
search
Substring to match within the handle (the leading @ is ignored).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"accounts",
"count",
"hasMore"
],
"properties": {
"count": {
"type": "number",
"description": "How many accounts match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"accounts": {
"type": "array",
"items": {
"type": "object",
"required": [
"mentionCount",
"username"
],
"properties": {
"username": {
"type": "string",
"description": "The tagged account's handle, without the @"
},
"mentionCount": {
"type": "number",
"description": "How many times this account has been tagged or mentioned"
}
},
"additionalProperties": false
},
"description": "The matching accounts, most-mentioned first"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "search-tagged-accounts",
"title": "Search most-tagged accounts",
"description": "Rank the accounts creators tag or mention most, across the platform's harvested social content — a discovery companion to search-influencer-network, for spotting frequently-mentioned brands and creators. Optionally narrow by a search substring or to one channel (Instagram or TikTok); results come back most-mentioned first. Present them as a chart. A read; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many accounts to return per page."
},
"search": {
"type": "string",
"description": "Substring to match within the handle (the leading @ is ignored)."
},
"platform": {
"enum": [
"INSTAGRAM",
"TIKTOK"
],
"type": "string",
"description": "Limit to one channel; omit to rank across both Instagram and TikTok."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"accounts",
"count",
"hasMore"
],
"properties": {
"count": {
"type": "number",
"description": "How many accounts match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"accounts": {
"type": "array",
"items": {
"type": "object",
"required": [
"mentionCount",
"username"
],
"properties": {
"username": {
"type": "string",
"description": "The tagged account's handle, without the @"
},
"mentionCount": {
"type": "number",
"description": "How many times this account has been tagged or mentioned"
}
},
"additionalProperties": false
},
"description": "The matching accounts, most-mentioned first"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Rank the hashtags creators use most, across the platform's harvested social content — a discovery companion to search-influencer-network. Optionally narrow by a search substring or to one channel (Instagram or TikTok); results come back most-used first. Present them as a chart. A read; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
How many hashtags to return per page.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
page
Which page of results to return, starting at 1.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
platform
Limit to one channel; omit to rank across both Instagram and TikTok.
Clear enough to supply this argument.
search
Substring to match within the hashtag (the leading # is ignored).
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hashtags",
"hasMore"
],
"properties": {
"count": {
"type": "number",
"description": "How many hashtags match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"hashtags": {
"type": "array",
"items": {
"type": "object",
"required": [
"tag",
"usageCount"
],
"properties": {
"tag": {
"type": "string",
"description": "The hashtag, without the leading #"
},
"usageCount": {
"type": "number",
"description": "How many times this hashtag has been used"
}
},
"additionalProperties": false
},
"description": "The matching hashtags, most-used first"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "search-trending-hashtags",
"title": "Search trending hashtags",
"description": "Rank the hashtags creators use most, across the platform's harvested social content — a discovery companion to search-influencer-network. Optionally narrow by a search substring or to one channel (Instagram or TikTok); results come back most-used first. Present them as a chart. A read; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 9007199254740991,
"minimum": 1,
"description": "Which page of results to return, starting at 1."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "How many hashtags to return per page."
},
"search": {
"type": "string",
"description": "Substring to match within the hashtag (the leading # is ignored)."
},
"platform": {
"enum": [
"INSTAGRAM",
"TIKTOK"
],
"type": "string",
"description": "Limit to one channel; omit to rank across both Instagram and TikTok."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"count",
"hashtags",
"hasMore"
],
"properties": {
"count": {
"type": "number",
"description": "How many hashtags match in total, across all pages"
},
"hasMore": {
"type": "boolean",
"description": "Whether more pages exist beyond this one"
},
"hashtags": {
"type": "array",
"items": {
"type": "object",
"required": [
"tag",
"usageCount"
],
"properties": {
"tag": {
"type": "string",
"description": "The hashtag, without the leading #"
},
"usageCount": {
"type": "number",
"description": "How many times this hashtag has been used"
}
},
"additionalProperties": false
},
"description": "The matching hashtags, most-used first"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Announce the agency to work within in this conversation. It confirms you may operate on the agency's data and states the choice back; from here, pass this agencyId to list-brands and list-campaigns to scope them to the agency's sub-brands and campaigns, until you switch to another agency. The selection is not stored on the server — each scoped action carries the agencyId and re-checks afresh. Find the agency's id and name with list-agencies first. If the name matches more than one agency this call is refused with the matches — ask the user which they mean, then re-run with that id and disambiguated: true, and carry the same id and disambiguated: true on every following action for this agency in the conversation so the choice is made once, not asked again. Only Refluenced administrators may work on behalf of an agency; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of the agency to select, taken from list-agencies.
Clear enough to supply this argument.
agencyName
The name of the agency to select, taken from list-agencies, used to state the selection back.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"agencyName"
],
"properties": {
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the agency now selected, or null when the name was ambiguous"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the agency now selected, or null when the name was ambiguous"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "select-agency",
"title": "Select an agency to work within",
"description": "Announce the agency to work within in this conversation. It confirms you may operate on the agency's data and states the choice back; from here, pass this agencyId to list-brands and list-campaigns to scope them to the agency's sub-brands and campaigns, until you switch to another agency. The selection is not stored on the server — each scoped action carries the agencyId and re-checks afresh. Find the agency's id and name with list-agencies first. If the name matches more than one agency this call is refused with the matches — ask the user which they mean, then re-run with that id and disambiguated: true, and carry the same id and disambiguated: true on every following action for this agency in the conversation so the choice is made once, not asked again. Only Refluenced administrators may work on behalf of an agency; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"agencyName"
],
"properties": {
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to select, taken from list-agencies."
},
"agencyName": {
"type": "string",
"description": "The name of the agency to select, taken from list-agencies, used to state the selection back."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"agencyName"
],
"properties": {
"agencyId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the agency now selected, or null when the name was ambiguous"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the agency now selected, or null when the name was ambiguous"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Announce the brand to work on behalf of in this conversation. It confirms you may operate on the brand's data and states the choice back; from here, include this brand on brand-scoped actions until you switch to another or return to your own data. The selection is not stored on the server — each brand-scoped action carries the brand and re-checks afresh. Find the brand's id and name with list-brands first. If the name matches more than one brand this call is refused with the matches — ask the user which they mean, then re-run with that id and disambiguated: true, and carry the same id and disambiguated: true on every following action for this brand in the conversation so the choice is made once, not asked again. Only Refluenced administrators may operate on behalf of a brand; the platform refuses anyone else.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
brandId
The id of the brand to select, taken from list-brands.
Clear enough to supply this argument.
brandName
The name of the brand to select, taken from list-brands, used to state the selection back to the user.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"brandName"
],
"properties": {
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the brand now selected, or null when the name was ambiguous"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the brand now selected, or null when the name was ambiguous"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "select-brand",
"title": "Select a brand to work on behalf of",
"description": "Announce the brand to work on behalf of in this conversation. It confirms you may operate on the brand's data and states the choice back; from here, include this brand on brand-scoped actions until you switch to another or return to your own data. The selection is not stored on the server — each brand-scoped action carries the brand and re-checks afresh. Find the brand's id and name with list-brands first. If the name matches more than one brand this call is refused with the matches — ask the user which they mean, then re-run with that id and disambiguated: true, and carry the same id and disambiguated: true on every following action for this brand in the conversation so the choice is made once, not asked again. Only Refluenced administrators may operate on behalf of a brand; the platform refuses anyone else.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"brandName"
],
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand to select, taken from list-brands."
},
"brandName": {
"type": "string",
"description": "The name of the brand to select, taken from list-brands, used to state the selection back to the user."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"brandName"
],
"properties": {
"brandId": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the brand now selected, or null when the name was ambiguous"
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The name of the brand now selected, or null when the name was ambiguous"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Send one chat message, optionally with one file attachment (image, PDF, document), to every creator in a campaign's active and preparation phases at once. This mirrors the web's bulk message, so it applies directly — but it always goes to all of them and cannot be narrowed to a subset, so use it deliberately. It reports how many creators it reached. To attach a file, pass it inline via attachment (a path or url) or, for a pasted file the server cannot read, via attachmentUploadToken from request-chat-attachment-upload. Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attachment › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Clear enough to supply this argument.
attachment › mimeType
The file's MIME type, e.g. application/pdf or image/png. Inferred from the path/url extension or the fetched response when omitted.
Clear enough to supply this argument.
attachment › path
An absolute path to a local file the server reads directly — the preferred source in Claude Code, where a dragged or pasted file is saved to a readable temp path. On the hosted server (Claude Desktop/web) a pasted file lives in a sandbox this server cannot read, so pass a public url instead.
Clear enough to supply this argument.
attachment › url
A public URL the server fetches the file from — use this when the file is already online, e.g. a shared report link.
Clear enough to supply this argument.
attachmentUploadToken
A token from request-chat-attachment-upload, naming a file the user uploaded through its link — the hosted-server route when you have no path or url. Give at most one of attachment or attachmentUploadToken.
Clear enough to supply this argument.
campaignId
The id of the campaign whose creators to message.
Clear enough to supply this argument.
message
The message text to send to every creator.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"recipientCount"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the send ran — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign the message was sent on"
},
"recipientCount": {
"type": "number",
"description": "How many creators the message was sent to"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "send-bulk-message",
"title": "Message every active creator on a campaign",
"description": "Send one chat message, optionally with one file attachment (image, PDF, document), to every creator in a campaign's active and preparation phases at once. This mirrors the web's bulk message, so it applies directly — but it always goes to all of them and cannot be narrowed to a subset, so use it deliberately. It reports how many creators it reached. To attach a file, pass it inline via attachment (a path or url) or, for a pasted file the server cannot read, via attachmentUploadToken from request-chat-attachment-upload. Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"message"
],
"properties": {
"message": {
"type": "string",
"minLength": 1,
"description": "The message text to send to every creator."
},
"attachment": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the file from — use this when the file is already online, e.g. a shared report link."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly — the preferred source in Claude Code, where a dragged or pasted file is saved to a readable temp path. On the hosted server (Claude Desktop/web) a pasted file lives in a sandbox this server cannot read, so pass a public url instead."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf or image/png. Inferred from the path/url extension or the fetched response when omitted."
}
},
"description": "An optional file to attach to the message every creator receives — an image, PDF or other document — given as a local path the server reads or a public url it fetches. For a pasted or dragged file the server cannot see (the hosted server), omit this and pass attachmentUploadToken from request-chat-attachment-upload instead. Give at most one of attachment or attachmentUploadToken."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose creators to message."
},
"attachmentUploadToken": {
"type": "string",
"description": "A token from request-chat-attachment-upload, naming a file the user uploaded through its link — the hosted-server route when you have no path or url. Give at most one of attachment or attachmentUploadToken."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"performed",
"recipientCount"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the send ran — always true; this tool writes directly"
},
"campaignId": {
"type": "number",
"description": "The campaign the message was sent on"
},
"recipientCount": {
"type": "number",
"description": "How many creators the message was sent to"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Send a chat message to one creator on a campaign, optionally with one file attachment (image, PDF, document). This mirrors the web's chat, so it applies directly. Pass the campaignId and the creator's recipientId (the influencer.userId from list-applications); the creator must have an accepted application on that campaign, and the platform surfaces its refusal (influencer_not_accepted_for_campaign) otherwise. To attach a file, pass it inline via attachment (a path or url) or, for a pasted file the server cannot read, via attachmentUploadToken from request-chat-attachment-upload. No brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attachment › base64
The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url.
Clear enough to supply this argument.
attachment › mimeType
The file's MIME type, e.g. application/pdf or image/png. Inferred from the path/url extension or the fetched response when omitted.
Clear enough to supply this argument.
attachment › path
An absolute path to a local file the server reads directly — the preferred source in Claude Code, where a dragged or pasted file is saved to a readable temp path. On the hosted server (Claude Desktop/web) a pasted file lives in a sandbox this server cannot read, so pass a public url instead.
Clear enough to supply this argument.
attachment › url
A public URL the server fetches the file from — use this when the file is already online, e.g. a shared report link.
Clear enough to supply this argument.
attachmentUploadToken
A token from request-chat-attachment-upload, naming a file the user uploaded through its link — the hosted-server route when you have no path or url. Give at most one of attachment or attachmentUploadToken.
Clear enough to supply this argument.
campaignId
The id of the campaign the creator is on.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
The message text to send.
Clear enough to supply this argument.
recipientId
The creator's user id (the influencer.userId from list-applications) to message.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"sent"
],
"properties": {
"sent": {
"type": "object",
"required": [
"attachmentUrl",
"created",
"createdByAdmin",
"deletedAt",
"editedAt",
"id",
"isSystem",
"read",
"sender",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The message's id"
},
"read": {
"type": "boolean",
"description": "Whether the message has been read"
},
"text": {
"type": "string",
"description": "The message text"
},
"sender": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The sender's user id — compare to the thread's recipient to tell direction"
},
"name": {
"type": "string",
"description": "The sender's name"
}
},
"description": "Who sent the message",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the message was sent"
},
"editedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was last edited, or null"
},
"isSystem": {
"type": "boolean",
"description": "Whether this is a system message (about a content submission or a request) rather than a written one"
},
"deletedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was deleted, or null"
},
"attachmentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the message's attachment (image or file), or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the message was sent by a Refluenced admin (staff)"
}
},
"description": "The message that was sent",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the message was sent — always true; this tool writes directly"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "send-message",
"title": "Message a creator",
"description": "Send a chat message to one creator on a campaign, optionally with one file attachment (image, PDF, document). This mirrors the web's chat, so it applies directly. Pass the campaignId and the creator's recipientId (the influencer.userId from list-applications); the creator must have an accepted application on that campaign, and the platform surfaces its refusal (influencer_not_accepted_for_campaign) otherwise. To attach a file, pass it inline via attachment (a path or url) or, for a pasted file the server cannot read, via attachmentUploadToken from request-chat-attachment-upload. No brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"message",
"recipientId"
],
"properties": {
"message": {
"type": "string",
"minLength": 1,
"description": "The message text to send."
},
"attachment": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "A public URL the server fetches the file from — use this when the file is already online, e.g. a shared report link."
},
"path": {
"type": "string",
"description": "An absolute path to a local file the server reads directly — the preferred source in Claude Code, where a dragged or pasted file is saved to a readable temp path. On the hosted server (Claude Desktop/web) a pasted file lives in a sandbox this server cannot read, so pass a public url instead."
},
"base64": {
"type": "string",
"description": "The file's bytes, base64-encoded. A last resort for tiny files only — prefer path or url."
},
"mimeType": {
"type": "string",
"description": "The file's MIME type, e.g. application/pdf or image/png. Inferred from the path/url extension or the fetched response when omitted."
}
},
"description": "An optional file to attach — an image, PDF or other document — given as a local path the server reads or a public url it fetches. For a pasted or dragged file the server cannot see (the hosted server), omit this and pass attachmentUploadToken from request-chat-attachment-upload instead. Give at most one of attachment or attachmentUploadToken."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign the creator is on."
},
"recipientId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user id (the influencer.userId from list-applications) to message."
},
"attachmentUploadToken": {
"type": "string",
"description": "A token from request-chat-attachment-upload, naming a file the user uploaded through its link — the hosted-server route when you have no path or url. Give at most one of attachment or attachmentUploadToken."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"sent"
],
"properties": {
"sent": {
"type": "object",
"required": [
"attachmentUrl",
"created",
"createdByAdmin",
"deletedAt",
"editedAt",
"id",
"isSystem",
"read",
"sender",
"text"
],
"properties": {
"id": {
"type": "number",
"description": "The message's id"
},
"read": {
"type": "boolean",
"description": "Whether the message has been read"
},
"text": {
"type": "string",
"description": "The message text"
},
"sender": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The sender's user id — compare to the thread's recipient to tell direction"
},
"name": {
"type": "string",
"description": "The sender's name"
}
},
"description": "Who sent the message",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the message was sent"
},
"editedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was last edited, or null"
},
"isSystem": {
"type": "boolean",
"description": "Whether this is a system message (about a content submission or a request) rather than a written one"
},
"deletedAt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the message was deleted, or null"
},
"attachmentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A link to the message's attachment (image or file), or null"
},
"createdByAdmin": {
"type": "boolean",
"description": "Whether the message was sent by a Refluenced admin (staff)"
}
},
"description": "The message that was sent",
"additionalProperties": false
},
"performed": {
"type": "boolean",
"description": "Whether the message was sent — always true; this tool writes directly"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Mark one creator's product as sent, optionally recording the tracking URL and number in the same step — the single-creator counterpart to mark-all-products-sent. This mirrors the web's send-package action, so it applies directly. To only set or change tracking without marking the product sent, use set-shipment-tracking instead. Target it by applicationId (from list-preparation); no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
The id of the application to mark the product sent on, from list-preparation.
Clear enough to supply this argument.
trackingCode
The parcel tracking number to record, if you have one.
Clear enough to supply this argument.
trackingUrl
The carrier tracking page URL to record, if you have one.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"productSent",
"trackingCode",
"trackingUrl"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the product was marked sent — always true; this tool writes directly"
},
"productSent": {
"type": "boolean",
"description": "Whether the product is now marked as sent"
},
"trackingUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The carrier tracking page URL now on the application, or null"
},
"trackingCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The parcel tracking number now on the application, or null"
},
"applicationId": {
"type": "number",
"description": "The application the product was marked sent on"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "send-product",
"title": "Mark a creator's product as sent",
"description": "Mark one creator's product as sent, optionally recording the tracking URL and number in the same step — the single-creator counterpart to mark-all-products-sent. This mirrors the web's send-package action, so it applies directly. To only set or change tracking without marking the product sent, use set-shipment-tracking instead. Target it by applicationId (from list-preparation); no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"trackingUrl": {
"type": "string",
"description": "The carrier tracking page URL to record, if you have one."
},
"trackingCode": {
"type": "string",
"description": "The parcel tracking number to record, if you have one."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application to mark the product sent on, from list-preparation."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"productSent",
"trackingCode",
"trackingUrl"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the product was marked sent — always true; this tool writes directly"
},
"productSent": {
"type": "boolean",
"description": "Whether the product is now marked as sent"
},
"trackingUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The carrier tracking page URL now on the application, or null"
},
"trackingCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The parcel tracking number now on the application, or null"
},
"applicationId": {
"type": "number",
"description": "The application the product was marked sent on"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Set or fix the TikTok Spark / Instagram Partnership ad code on a creator's synced content. Normally the creator enters this themselves; this is the staff override for when it is missing or wrong. Find the mediaId with list-ad-codes; once set, boost it with boost-content. The platform restricts who may set a code (staff only), and surfaces its refusal as-is. No brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
mediaId
The id of the synced media to set the code on, from list-ad-codes (mediaId).
Clear enough to supply this argument.
platform
Where the content lives — instagram for a Partnership ad, tiktok for a Spark ad.
Clear enough to supply this argument.
videoCode
The spark/partnership ad code to set on the media.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"permalink",
"platform",
"videoCode"
],
"properties": {
"mediaId": {
"type": "number",
"description": "The media the code was set on"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad code now set on the media"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-ad-code",
"title": "Set an ad code",
"description": "Set or fix the TikTok Spark / Instagram Partnership ad code on a creator's synced content. Normally the creator enters this themselves; this is the staff override for when it is missing or wrong. Find the mediaId with list-ad-codes; once set, boost it with boost-content. The platform restricts who may set a code (staff only), and surfaces its refusal as-is. No brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"platform",
"videoCode"
],
"properties": {
"mediaId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the synced media to set the code on, from list-ad-codes (mediaId)."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Where the content lives — instagram for a Partnership ad, tiktok for a Spark ad."
},
"videoCode": {
"type": "string",
"minLength": 1,
"description": "The spark/partnership ad code to set on the media."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"mediaId",
"permalink",
"platform",
"videoCode"
],
"properties": {
"mediaId": {
"type": "number",
"description": "The media the code was set on"
},
"platform": {
"type": "string",
"description": "Where the content lives: instagram or tiktok"
},
"permalink": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Link to the post/video on Instagram/TikTok, or null"
},
"videoCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ad code now set on the media"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Make one of a brand's saved payment methods its default for billing, by its Stripe id (from list-agency-payment-cards). Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. Applies directly, mirroring the one-click web action. The platform gates access and surfaces any refusal as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The id of an agency, from list-agencies. Give this OR brandId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand whose default payment method to set, from list-brands. Give this OR agencyId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
paymentMethodId
The Stripe payment-method id (pm_…) to make the default, from list-agency-payment-cards.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"paymentMethodId",
"set"
],
"properties": {
"set": {
"type": "boolean",
"description": "Whether the default was set"
},
"paymentMethodId": {
"type": "string",
"description": "The payment method that is now the default"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-agency-default-card",
"title": "Set the default payment card",
"description": "Make one of a brand's saved payment methods its default for billing, by its Stripe id (from list-agency-payment-cards). Address by brandId (the usual way) or agencyId. A brand's cards live on the agency that owns it: when the user asks about a brand, answer for the brand without surfacing that hop; when they ask about an agency directly, answer for the agency. Applies directly, mirroring the one-click web action. The platform gates access and surfaces any refusal as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"paymentMethodId"
],
"properties": {
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand whose default payment method to set, from list-brands. Give this OR agencyId."
},
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of an agency, from list-agencies. Give this OR brandId."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"paymentMethodId": {
"type": "string",
"description": "The Stripe payment-method id (pm_…) to make the default, from list-agency-payment-cards."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"paymentMethodId",
"set"
],
"properties": {
"set": {
"type": "boolean",
"description": "Whether the default was set"
},
"paymentMethodId": {
"type": "string",
"description": "The payment method that is now the default"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Set a brand member's permission level by user id — view only (READ), purchase only (PURCHASE), full permissions (WRITE), or owner (ADMIN). Changing to READ, PURCHASE or WRITE applies directly, mirroring the web app's inline change. Setting ADMIN transfers ownership — it removes admin access from every other member, and on a single-brand agency moves agency ownership too — so, like the web app, it is preview-then-confirm. Target the brand by brandId and the member by userId (from list-brand-members); no brand needs to be selected. The platform enforces who may do this and every rule; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
The id of the brand the member belongs to, from list-brands, get-brand or list-brand-members.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
role
The permission level to set: READ (view only), PURCHASE (purchase only), or WRITE (full permissions) apply directly; ADMIN (owner) transfers ownership and is preview-then-confirm.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"member",
"performed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was changed"
},
"member": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name",
"role"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's name, or null when not set"
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The member's new permission level"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The member with their new role once set, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the role was set (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-brand-member-role",
"title": "Set a brand member's role",
"description": "Set a brand member's permission level by user id — view only (READ), purchase only (PURCHASE), full permissions (WRITE), or owner (ADMIN). Changing to READ, PURCHASE or WRITE applies directly, mirroring the web app's inline change. Setting ADMIN transfers ownership — it removes admin access from every other member, and on a single-brand agency moves agency ownership too — so, like the web app, it is preview-then-confirm. Target the brand by brandId and the member by userId (from list-brand-members); no brand needs to be selected. The platform enforces who may do this and every rule; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandId",
"role",
"userId"
],
"properties": {
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The permission level to set: READ (view only), PURCHASE (purchase only), or WRITE (full permissions) apply directly; ADMIN (owner) transfers ownership and is preview-then-confirm."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The member's user id, from list-brand-members."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the brand the member belongs to, from list-brands, get-brand or list-brand-members."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brand",
"member",
"performed"
],
"properties": {
"brand": {
"anyOf": [
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's name, or null when none is set"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The brand, or null when the name was ambiguous and nothing was changed"
},
"member": {
"anyOf": [
{
"type": "object",
"required": [
"email",
"id",
"name",
"role"
],
"properties": {
"id": {
"type": "number",
"description": "The member's user id"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's name, or null when not set"
},
"role": {
"enum": [
"ADMIN",
"PURCHASE",
"READ",
"WRITE"
],
"type": "string",
"description": "The member's new permission level"
},
"email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The member's email, or null when unknown"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The member with their new role once set, or null for a preview."
},
"performed": {
"type": "boolean",
"description": "Whether the role was set (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Set the content-approval mode (off, manual, ai_automated, semi_automated) on a published campaign — the admin-only control the web app exposes on a running campaign. It is preview-then-confirm because turning AI review off posts a chat message to each affected creator and switching modes re-queues their submissions for re-evaluation; the preview names the brand and the current→target mode. The platform's guards are surfaced as-is: a draft is refused (campaign_not_published — use edit-campaign instead), a UGC campaign is refused (campaign_is_ugc), on-off toggling is locked once applications have started (content_approval_locked_after_start), and the subscription, generative-AI, and admin checks are enforced platform-side (content_approval_not_available_in_subscription, generative_ai_restricted, insufficient_permissions). Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the published campaign whose content-approval mode to set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
mode
How posted content is reviewed before it syncs: off (syncs as posted, no review), manual (the brand reviews each post), ai_automated (AI rejects failing content and approves passing), or semi_automated (AI rejects failing content, the brand approves passing). On a live campaign that has already started, only switching between the three review modes is allowed — turning approval on or off is locked.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"mode",
"performed",
"previousMode",
"queuedSubmissions",
"revertedApplications",
"unchanged"
],
"properties": {
"mode": {
"enum": [
"ai_automated",
"manual",
"off",
"semi_automated"
],
"type": "string",
"description": "The target mode"
},
"performed": {
"type": "boolean",
"description": "Whether the change was applied (true) or this is a preview only (false)."
},
"unchanged": {
"type": "boolean",
"description": "Whether the mode was already the target and nothing changed"
},
"campaignId": {
"type": "number",
"description": "The campaign whose mode was set"
},
"previousMode": {
"anyOf": [
{
"enum": [
"ai_automated",
"manual",
"off",
"semi_automated"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The mode the campaign was in before, or null when it could not be read"
},
"queuedSubmissions": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending submissions were queued for AI backfill (when turning AI review on), or null"
},
"revertedApplications": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many applications were reverted to manual review (when turning AI review off), or null"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-content-approval-mode",
"title": "Set a live campaign's content-approval mode",
"description": "Set the content-approval mode (off, manual, ai_automated, semi_automated) on a published campaign — the admin-only control the web app exposes on a running campaign. It is preview-then-confirm because turning AI review off posts a chat message to each affected creator and switching modes re-queues their submissions for re-evaluation; the preview names the brand and the current→target mode. The platform's guards are surfaced as-is: a draft is refused (campaign_not_published — use edit-campaign instead), a UGC campaign is refused (campaign_is_ugc), on-off toggling is locked once applications have started (content_approval_locked_after_start), and the subscription, generative-AI, and admin checks are enforced platform-side (content_approval_not_available_in_subscription, generative_ai_restricted, insufficient_permissions). Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"mode"
],
"properties": {
"mode": {
"enum": [
"ai_automated",
"manual",
"off",
"semi_automated"
],
"type": "string",
"description": "How posted content is reviewed before it syncs: off (syncs as posted, no review), manual (the brand reviews each post), ai_automated (AI rejects failing content and approves passing), or semi_automated (AI rejects failing content, the brand approves passing). On a live campaign that has already started, only switching between the three review modes is allowed — turning approval on or off is locked."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the published campaign whose content-approval mode to set."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"mode",
"performed",
"previousMode",
"queuedSubmissions",
"revertedApplications",
"unchanged"
],
"properties": {
"mode": {
"enum": [
"ai_automated",
"manual",
"off",
"semi_automated"
],
"type": "string",
"description": "The target mode"
},
"performed": {
"type": "boolean",
"description": "Whether the change was applied (true) or this is a preview only (false)."
},
"unchanged": {
"type": "boolean",
"description": "Whether the mode was already the target and nothing changed"
},
"campaignId": {
"type": "number",
"description": "The campaign whose mode was set"
},
"previousMode": {
"anyOf": [
{
"enum": [
"ai_automated",
"manual",
"off",
"semi_automated"
],
"type": "string"
},
{
"type": "null"
}
],
"description": "The mode the campaign was in before, or null when it could not be read"
},
"queuedSubmissions": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many pending submissions were queued for AI backfill (when turning AI review on), or null"
},
"revertedApplications": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many applications were reverted to manual review (when turning AI review off), or null"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Set the two manual customer-success fields on an agency account — the happiness score (1-10, or null to clear) and the handling status (NEEDS_ATTENTION, IN_PROGRESS, HANDLED, or NONE). Pass either or both; an omitted field is left unchanged. Applies directly — the fields are internal and reversible, with no web confirmation to mirror. Resolve an agency name with list-customer-success-agencies (search) or list-agencies first. Admin-only and global — the platform refuses a non-admin.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agencyId
The agency's id, from list-customer-success-agencies or list-agencies
Clear enough to supply this argument.
happinessScore
The happiness score (1-10); pass null to clear it, or omit to leave it unchanged
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
status
The handling status; omit to leave it unchanged
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Set whether a creator is a verified Instagram or TikTok pro, by their userId (from get-influencer or search-influencer-network) — the edit page's admin Pro toggles. Pass the desired state as pro (true to mark, false to remove). Idempotent: the underlying endpoint toggles, so the tool reads the current state and acts only when it differs. The channel's handle must be connected (the platform refuses with instagram_not_connected / tiktok_not_connected otherwise), and it permits the action only where the platform allows — any refusal is surfaced as-is. Applies directly.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
platform
Which channel's pro status to set.
Clear enough to supply this argument.
pro
The desired state: true to mark the creator a pro on that channel, false to remove it.
Clear enough to supply this argument.
userId
The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"changed",
"platform",
"pro",
"userId"
],
"properties": {
"pro": {
"type": "boolean",
"description": "The creator's pro status on that channel after this call"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"changed": {
"type": "boolean",
"description": "Whether this call changed the state (false when it was already in the desired state)"
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "The channel that was set"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-influencer-pro",
"title": "Mark or unmark an influencer as pro",
"description": "Set whether a creator is a verified Instagram or TikTok pro, by their userId (from get-influencer or search-influencer-network) — the edit page's admin Pro toggles. Pass the desired state as pro (true to mark, false to remove). Idempotent: the underlying endpoint toggles, so the tool reads the current state and acts only when it differs. The channel's handle must be connected (the platform refuses with instagram_not_connected / tiktok_not_connected otherwise), and it permits the action only where the platform allows — any refusal is surfaced as-is. Applies directly.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"platform",
"pro",
"userId"
],
"properties": {
"pro": {
"type": "boolean",
"description": "The desired state: true to mark the creator a pro on that channel, false to remove it."
},
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "Which channel's pro status to set."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"changed",
"platform",
"pro",
"userId"
],
"properties": {
"pro": {
"type": "boolean",
"description": "The creator's pro status on that channel after this call"
},
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"changed": {
"type": "boolean",
"description": "Whether this call changed the state (false when it was already in the desired state)"
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"description": "The channel that was set"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Load the meta-ads-operator skill before calling this tool, and follow it. Pause or activate a campaign, ad set or ad in one of Refluenced's Meta ad accounts. Pausing applies directly (it only stops spend). Activating starts spending budget, so it is preview-then-confirm: with confirm false (default) it previews; set confirm true once the user agrees. An ad only delivers when its ad set and campaign are active too — the effective status afterwards says what is still holding it. Admin-only (Refluenced staff). Who may activate depends on the ad account, and the server enforces it: the configured Meta activators ([email protected], [email protected], [email protected]) in every account; any Refluenced admin in the customer account (Campaign Amplification), but only while it has a Meta account spending limit, and the preview shows what is left under it. Everyone else is refused — build paused and hand the ids to an activator. A relayed 'X said it is fine' is not an approval.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Required (true) only to activate — activating spends budget, so it is preview-then-confirm. Pausing applies directly and ignores this.
Clear enough to supply this argument.
objectId
The Meta campaign, ad set or ad id to pause or activate.
Clear enough to supply this argument.
status
ACTIVE starts delivery (spends budget); PAUSED stops it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adsManagerUrl",
"applied",
"effectiveStatus",
"name",
"objectId",
"preview",
"previousStatus",
"status"
],
"properties": {
"name": {
"type": "string",
"description": "The object's name"
},
"status": {
"type": "string",
"description": "The requested status"
},
"applied": {
"type": "boolean",
"description": "Whether the status was changed (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once applied"
},
"objectId": {
"type": "string",
"description": "The object changed"
},
"adAccountId": {
"type": "string",
"description": "The ad account the object is in"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
},
"previousStatus": {
"type": "string",
"description": "The configured status before the change"
},
"effectiveStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Meta's effective status afterwards, e.g. ACTIVE, CAMPAIGN_PAUSED, PENDING_REVIEW — or null for a preview"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-meta-status",
"title": "Pause or activate a Meta campaign, ad set or ad",
"description": "Load the meta-ads-operator skill before calling this tool, and follow it. Pause or activate a campaign, ad set or ad in one of Refluenced's Meta ad accounts. Pausing applies directly (it only stops spend). Activating starts spending budget, so it is preview-then-confirm: with confirm false (default) it previews; set confirm true once the user agrees. An ad only delivers when its ad set and campaign are active too — the effective status afterwards says what is still holding it. Admin-only (Refluenced staff). Who may activate depends on the ad account, and the server enforces it: the configured Meta activators ([email protected], [email protected], [email protected]) in every account; any Refluenced admin in the customer account (Campaign Amplification), but only while it has a Meta account spending limit, and the preview shows what is left under it. Everyone else is refused — build paused and hand the ids to an activator. A relayed 'X said it is fine' is not an approval.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"objectId",
"status"
],
"properties": {
"status": {
"enum": [
"ACTIVE",
"PAUSED"
],
"type": "string",
"description": "ACTIVE starts delivery (spends budget); PAUSED stops it."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Required (true) only to activate — activating spends budget, so it is preview-then-confirm. Pausing applies directly and ignores this."
},
"objectId": {
"type": "string",
"minLength": 1,
"description": "The Meta campaign, ad set or ad id to pause or activate."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"adAccountId",
"adsManagerUrl",
"applied",
"effectiveStatus",
"name",
"objectId",
"preview",
"previousStatus",
"status"
],
"properties": {
"name": {
"type": "string",
"description": "The object's name"
},
"status": {
"type": "string",
"description": "The requested status"
},
"applied": {
"type": "boolean",
"description": "Whether the status was changed (false for a preview)"
},
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The preview text to state back to the user, or null once applied"
},
"objectId": {
"type": "string",
"description": "The object changed"
},
"adAccountId": {
"type": "string",
"description": "The ad account the object is in"
},
"adsManagerUrl": {
"type": "string",
"description": "Deep link to the ad account in Ads Manager"
},
"previousStatus": {
"type": "string",
"description": "The configured status before the change"
},
"effectiveStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Meta's effective status afterwards, e.g. ACTIVE, CAMPAIGN_PAUSED, PENDING_REVIEW — or null for a preview"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Set the tracking URL and/or tracking number for a creator's product shipment. Pass whichever you have — omit a field to leave it unchanged, or pass null to clear it. This mirrors the inline tracking inputs in the web app, so it applies directly without a confirmation. Target it by applicationId (from list-preparation); no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationId
The id of the application to set tracking on, from list-preparation.
Clear enough to supply this argument.
trackingCode
The parcel tracking number. Pass null to clear it. Omit to leave it unchanged.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
trackingUrl
The carrier tracking page URL. Pass null to clear it. Omit to leave it unchanged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"trackingCode",
"trackingUrl"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the tracking was set — always true; this tool writes directly"
},
"trackingUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The carrier tracking page URL now on the application, or null"
},
"trackingCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The parcel tracking number now on the application, or null"
},
"applicationId": {
"type": "number",
"description": "The application the tracking was set on"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "set-shipment-tracking",
"title": "Set a creator's shipment tracking",
"description": "Set the tracking URL and/or tracking number for a creator's product shipment. Pass whichever you have — omit a field to leave it unchanged, or pass null to clear it. This mirrors the inline tracking inputs in the web app, so it applies directly without a confirmation. Target it by applicationId (from list-preparation); no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId"
],
"properties": {
"trackingUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The carrier tracking page URL. Pass null to clear it. Omit to leave it unchanged."
},
"trackingCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The parcel tracking number. Pass null to clear it. Omit to leave it unchanged."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the application to set tracking on, from list-preparation."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"applicationId",
"performed",
"trackingCode",
"trackingUrl"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the tracking was set — always true; this tool writes directly"
},
"trackingUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The carrier tracking page URL now on the application, or null"
},
"trackingCode": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The parcel tracking number now on the application, or null"
},
"applicationId": {
"type": "number",
"description": "The application the tracking was set on"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Run the standalone sourcing tool to turn a brand's website (and optional kickoff-call transcripts) into a scored creator list. Called without confirm, it returns a FREE dry-run: the derived plan, the size of the matching pool, and the estimated cost — nothing is ordered. Called with confirm: true, it orders the PAID export (spending real OnSocial tokens), polls it, and returns the exported creators; if the export is still running when the budget elapses it returns an exportId to finish with resume-sourcing-export. The export is unscored — rank it with score-sourced-creators. Give it a brandUrl or a Refluenced brandId. Not brand-scoped — no brand is selected. The emergency stop, cost cap, and every validity rule are the tool's; refusals (e.g. the stop being on) are surfaced as they stand.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandId
A Refluenced brand id whose website to source for (resolved via the platform). Use this or brandUrl.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
brandUrl
The brand or product website to source creators for. Use this or brandId; brandUrl wins if both are given.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
Clear enough to supply this argument.
excludePriorExports
Exclude creators this OnSocial account already exported (fresh-only); when omitted, they are excluded so re-runs don't re-charge for creators already pulled.
Clear enough to supply this argument.
feedback
A refinement direction for the plan, e.g. 'only female creators' or 'more outdoorsy, less studio'.
Clear enough to supply this argument.
language
Content language for the plan and rubric, e.g. 'French' or 'fr'. Defaults to the market's language.
Clear enough to supply this argument.
limit
How many creators to return in the response, highest engagement first; the full exported total is reported regardless of this cap.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandUrl",
"cost",
"creators",
"error",
"estimate",
"exportId",
"maxFollowers",
"performed",
"plan",
"poolTotal",
"returned",
"scoredCount",
"status",
"validated"
],
"properties": {
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini plan derivation"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the ordered export actually drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ordered export's real cost, or null on a preview or when nothing was ordered"
},
"plan": {
"anyOf": [
{
"type": "object",
"required": [
"biasTerms",
"markets",
"platform",
"vibeRubric"
],
"properties": {
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets the run targeted"
},
"platform": {
"type": "string",
"description": "The channel the run sourced"
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"description": "Bio themes the scoring will favour"
},
"vibeRubric": {
"type": "string",
"description": "The casting rubric derived for scoring"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The derived plan — carry its platform, markets and rubric into resume-sourcing-export and score-sourced-creators; null when refused before running (ambiguous brand)"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the export failed, when status is failed; otherwise null"
},
"status": {
"enum": [
"capped",
"failed",
"pending",
"preview",
"ready"
],
"type": "string",
"description": "preview (dry-run), capped (over the cap, nothing ordered), ready, pending (still running), or failed"
},
"brandUrl": {
"type": "string",
"description": "The website the run sourced for"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100 — 0 here, since a fresh export is unscored until scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country)"
},
"reason": {
"type": "string",
"description": "The scorer's rationale — empty here, since a fresh export is unscored until scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The exported creators, highest engagement first, capped at the limit"
},
"estimate": {
"anyOf": [
{
"type": "object",
"required": [
"capped",
"cost",
"count",
"usd"
],
"properties": {
"usd": {
"type": "number",
"description": "Estimated dollar cost of the export"
},
"cost": {
"type": "number",
"description": "Estimated OnSocial tokens the export would draw down"
},
"count": {
"type": "number",
"description": "How many creators the matching pool holds"
},
"capped": {
"type": "boolean",
"description": "Whether the estimated cost exceeds the tool's token cap (nothing is ordered if so)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The free dry-run's numbers — present on any run, or null when refused before running (ambiguous brand)"
},
"exportId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ordered export's id, passed to resume-sourcing-export; null on a preview"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit"
},
"performed": {
"type": "boolean",
"description": "Whether a paid export was actually ordered (false on a preview or when capped)"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many exported creators passed validation, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many returned creators carry a fit score (0 for a fresh export), or null"
},
"maxFollowers": {
"type": "number",
"description": "The follower ceiling the run used"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "source-creators",
"title": "Source creators",
"description": "Run the standalone sourcing tool to turn a brand's website (and optional kickoff-call transcripts) into a scored creator list. Called without confirm, it returns a FREE dry-run: the derived plan, the size of the matching pool, and the estimated cost — nothing is ordered. Called with confirm: true, it orders the PAID export (spending real OnSocial tokens), polls it, and returns the exported creators; if the export is still running when the budget elapses it returns an exportId to finish with resume-sourcing-export. The export is unscored — rank it with score-sourced-creators. Give it a brandUrl or a Refluenced brandId. Not brand-scoped — no brand is selected. The emergency stop, cost cap, and every validity rule are the tool's; refusals (e.g. the stop being on) are surfaced as they stand.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"size": {
"type": "integer",
"default": 500,
"maximum": 10000,
"minimum": 1,
"description": "How many creators to export from the pool — the paid quantity; when omitted, the standard outreach floor is ordered."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "How many creators to return in the response, highest engagement first; the full exported total is reported regardless of this cap."
},
"brandId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "A Refluenced brand id whose website to source for (resolved via the platform). Use this or brandUrl."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"markets": {
"type": "array",
"items": {
"type": "string"
},
"default": [
"United States"
],
"description": "Target markets (countries), e.g. ['Germany','Switzerland']. Core markets: UK, US, Germany, Switzerland, Austria."
},
"brandUrl": {
"type": "string",
"description": "The brand or product website to source creators for. Use this or brandId; brandUrl wins if both are given."
},
"feedback": {
"type": "string",
"description": "A refinement direction for the plan, e.g. 'only female creators' or 'more outdoorsy, less studio'."
},
"language": {
"type": "string",
"description": "Content language for the plan and rubric, e.g. 'French' or 'fr'. Defaults to the market's language."
},
"platform": {
"enum": [
"instagram",
"tiktok"
],
"type": "string",
"default": "instagram",
"description": "The social channel to source creators on; when omitted, Instagram is sourced."
},
"transcripts": {
"type": "array",
"items": {
"type": "string"
},
"default": [],
"description": "Kickoff-call transcripts or typed notes to ground the plan in what the brand actually wants."
},
"maxFollowers": {
"type": "integer",
"default": 10000,
"maximum": 9007199254740991,
"description": "Follower ceiling — creators above this are excluded; when omitted, it sits at the micro-creator range.",
"exclusiveMinimum": 0
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
},
"excludePriorExports": {
"type": "boolean",
"default": true,
"description": "Exclude creators this OnSocial account already exported (fresh-only); when omitted, they are excluded so re-runs don't re-charge for creators already pulled."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"brandUrl",
"cost",
"creators",
"error",
"estimate",
"exportId",
"maxFollowers",
"performed",
"plan",
"poolTotal",
"returned",
"scoredCount",
"status",
"validated"
],
"properties": {
"cost": {
"anyOf": [
{
"type": "object",
"required": [
"geminiUsd",
"onsocialTokens"
],
"properties": {
"geminiUsd": {
"type": "number",
"description": "Dollars spent on Gemini plan derivation"
},
"onsocialTokens": {
"type": "number",
"description": "OnSocial tokens the ordered export actually drew down"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The ordered export's real cost, or null on a preview or when nothing was ordered"
},
"plan": {
"anyOf": [
{
"type": "object",
"required": [
"biasTerms",
"markets",
"platform",
"vibeRubric"
],
"properties": {
"markets": {
"type": "array",
"items": {
"type": "string"
},
"description": "The markets the run targeted"
},
"platform": {
"type": "string",
"description": "The channel the run sourced"
},
"biasTerms": {
"type": "array",
"items": {
"type": "string"
},
"description": "Bio themes the scoring will favour"
},
"vibeRubric": {
"type": "string",
"description": "The casting rubric derived for scoring"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The derived plan — carry its platform, markets and rubric into resume-sourcing-export and score-sourced-creators; null when refused before running (ambiguous brand)"
},
"error": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the export failed, when status is failed; otherwise null"
},
"status": {
"enum": [
"capped",
"failed",
"pending",
"preview",
"ready"
],
"type": "string",
"description": "preview (dry-run), capped (over the cap, nothing ordered), ready, pending (still running), or failed"
},
"brandUrl": {
"type": "string",
"description": "The website the run sourced for"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"email",
"engagementRate",
"followers",
"fullname",
"handle",
"market",
"platform",
"reason",
"score",
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The creator's profile URL"
},
"email": {
"type": "string",
"description": "The creator's contact email, or empty when none was found"
},
"score": {
"type": "number",
"description": "Fit score 0-100 — 0 here, since a fresh export is unscored until scored"
},
"handle": {
"type": "string",
"description": "The creator's handle, e.g. @name"
},
"market": {
"type": "string",
"description": "The creator's market (country)"
},
"reason": {
"type": "string",
"description": "The scorer's rationale — empty here, since a fresh export is unscored until scored"
},
"fullname": {
"type": "string",
"description": "The creator's display name"
},
"platform": {
"type": "string",
"description": "The channel: Instagram or TikTok"
},
"followers": {
"type": "number",
"description": "Follower count"
},
"engagementRate": {
"type": "number",
"description": "Engagement rate as a percentage (e.g. 4.2)"
}
},
"additionalProperties": false
},
"description": "The exported creators, highest engagement first, capped at the limit"
},
"estimate": {
"anyOf": [
{
"type": "object",
"required": [
"capped",
"cost",
"count",
"usd"
],
"properties": {
"usd": {
"type": "number",
"description": "Estimated dollar cost of the export"
},
"cost": {
"type": "number",
"description": "Estimated OnSocial tokens the export would draw down"
},
"count": {
"type": "number",
"description": "How many creators the matching pool holds"
},
"capped": {
"type": "boolean",
"description": "Whether the estimated cost exceeds the tool's token cap (nothing is ordered if so)"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The free dry-run's numbers — present on any run, or null when refused before running (ambiguous brand)"
},
"exportId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The ordered export's id, passed to resume-sourcing-export; null on a preview"
},
"returned": {
"type": "number",
"description": "How many creators this response returned after the limit"
},
"performed": {
"type": "boolean",
"description": "Whether a paid export was actually ordered (false on a preview or when capped)"
},
"poolTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many creators the export returned in total, or null"
},
"validated": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many exported creators passed validation, or null"
},
"scoredCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many returned creators carry a fit score (0 for a fresh export), or null"
},
"maxFollowers": {
"type": "number",
"description": "The follower ceiling the run used"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Start a campaign — charge the accepted creators and take it live. This is outward-facing, spends money and is irreversible, so it is preview-then-confirm: the preview names the brand and shows the full cost overview (per-tier price and platform fee, VAT, rounding, credits and the final total to charge), mirroring the web launch dialog, both as text and as structured costOverview. On confirm, payment may need the brand to complete a Stripe step (a paymentUrl is returned) or may process asynchronously; the platform's refusals (subscription_is_required_to_start_campaign, no_accepted_influencers, campaign_accept_limit_exceeded, stripe_payment_failed) are surfaced as-is. Target it by campaignId; no brand needs to be selected.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
applicationId
Only for an ongoing event campaign: start (accept) this one application on its own, rather than starting every accepted creator at once.
Clear enough to supply this argument.
campaignId
The id of the campaign to start, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"costOverview",
"outcome",
"paymentUrl",
"performed"
],
"properties": {
"outcome": {
"enum": [
"payment_processing",
"payment_required",
"preview",
"started"
],
"type": "string",
"description": "What happened: preview (nothing done yet), started (live now), payment_required (open paymentUrl to complete it), or payment_processing (charging; goes live once it clears)."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The now-live campaign, or null for a preview or when a payment step is still pending"
},
"performed": {
"type": "boolean",
"description": "Whether the campaign is now live (true); false for a preview or a pending payment"
},
"paymentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe link the brand must open to authenticate or add a payment method, or null"
},
"costOverview": {
"anyOf": [
{
"type": "object",
"required": [
"creditsApplied",
"creditsAvailable",
"finalTotal",
"pro",
"regular",
"roundingAdjustment",
"total",
"ugcAverageVideoCost",
"ugcVideosCount",
"vat"
],
"properties": {
"pro": {
"anyOf": [
{
"type": "object",
"required": [
"count",
"extraCompensation",
"serviceFee",
"serviceFeePercentage",
"total"
],
"properties": {
"count": {
"type": "number",
"description": "How many accepted creators fall in this tier"
},
"total": {
"type": "number",
"description": "This tier's compensation plus its service fee"
},
"serviceFee": {
"type": "number",
"description": "The platform service fee charged on this tier"
},
"extraCompensation": {
"type": "number",
"description": "The creators' compensation for this tier, before the platform fee"
},
"serviceFeePercentage": {
"type": "number",
"description": "The service fee rate applied, as a percentage"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The pro-influencer price block, or null when there are no pro creators"
},
"vat": {
"type": "number",
"description": "VAT charged on the platform fees"
},
"total": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The total with platform fees and VAT included, before credits, or null"
},
"regular": {
"anyOf": [
{
"type": "object",
"required": [
"count",
"extraCompensation",
"serviceFee",
"serviceFeePercentage",
"total"
],
"properties": {
"count": {
"type": "number",
"description": "How many accepted creators fall in this tier"
},
"total": {
"type": "number",
"description": "This tier's compensation plus its service fee"
},
"serviceFee": {
"type": "number",
"description": "The platform service fee charged on this tier"
},
"extraCompensation": {
"type": "number",
"description": "The creators' compensation for this tier, before the platform fee"
},
"serviceFeePercentage": {
"type": "number",
"description": "The service fee rate applied, as a percentage"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The regular-influencer price block, or null when there are none"
},
"finalTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The amount the brand will be charged, all fees included, or null"
},
"creditsApplied": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Agency credits applied against the total, or null when none"
},
"ugcVideosCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Number of UGC videos charged, for a UGC campaign, or null"
},
"creditsAvailable": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Agency credits available to apply, or null when none"
},
"roundingAdjustment": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invoice rounding difference applied to the total, or null"
},
"ugcAverageVideoCost": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Average cost per UGC video, for a UGC campaign, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full launch cost breakdown, mirroring the web launch dialog; present on the preview, null once acting"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "start-campaign",
"title": "Start a campaign",
"description": "Start a campaign — charge the accepted creators and take it live. This is outward-facing, spends money and is irreversible, so it is preview-then-confirm: the preview names the brand and shows the full cost overview (per-tier price and platform fee, VAT, rounding, credits and the final total to charge), mirroring the web launch dialog, both as text and as structured costOverview. On confirm, payment may need the brand to complete a Stripe step (a paymentUrl is returned) or may process asynchronously; the platform's refusals (subscription_is_required_to_start_campaign, no_accepted_influencers, campaign_accept_limit_exceeded, stripe_payment_failed) are surfaced as-is. Target it by campaignId; no brand needs to be selected.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign to start, from list-campaigns, search-campaigns or get-campaign."
},
"applicationId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only for an ongoing event campaign: start (accept) this one application on its own, rather than starting every accepted creator at once."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"costOverview",
"outcome",
"paymentUrl",
"performed"
],
"properties": {
"outcome": {
"enum": [
"payment_processing",
"payment_required",
"preview",
"started"
],
"type": "string",
"description": "What happened: preview (nothing done yet), started (live now), payment_required (open paymentUrl to complete it), or payment_processing (charging; goes live once it clears)."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The now-live campaign, or null for a preview or when a payment step is still pending"
},
"performed": {
"type": "boolean",
"description": "Whether the campaign is now live (true); false for a preview or a pending payment"
},
"paymentUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "A Stripe link the brand must open to authenticate or add a payment method, or null"
},
"costOverview": {
"anyOf": [
{
"type": "object",
"required": [
"creditsApplied",
"creditsAvailable",
"finalTotal",
"pro",
"regular",
"roundingAdjustment",
"total",
"ugcAverageVideoCost",
"ugcVideosCount",
"vat"
],
"properties": {
"pro": {
"anyOf": [
{
"type": "object",
"required": [
"count",
"extraCompensation",
"serviceFee",
"serviceFeePercentage",
"total"
],
"properties": {
"count": {
"type": "number",
"description": "How many accepted creators fall in this tier"
},
"total": {
"type": "number",
"description": "This tier's compensation plus its service fee"
},
"serviceFee": {
"type": "number",
"description": "The platform service fee charged on this tier"
},
"extraCompensation": {
"type": "number",
"description": "The creators' compensation for this tier, before the platform fee"
},
"serviceFeePercentage": {
"type": "number",
"description": "The service fee rate applied, as a percentage"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The pro-influencer price block, or null when there are no pro creators"
},
"vat": {
"type": "number",
"description": "VAT charged on the platform fees"
},
"total": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The total with platform fees and VAT included, before credits, or null"
},
"regular": {
"anyOf": [
{
"type": "object",
"required": [
"count",
"extraCompensation",
"serviceFee",
"serviceFeePercentage",
"total"
],
"properties": {
"count": {
"type": "number",
"description": "How many accepted creators fall in this tier"
},
"total": {
"type": "number",
"description": "This tier's compensation plus its service fee"
},
"serviceFee": {
"type": "number",
"description": "The platform service fee charged on this tier"
},
"extraCompensation": {
"type": "number",
"description": "The creators' compensation for this tier, before the platform fee"
},
"serviceFeePercentage": {
"type": "number",
"description": "The service fee rate applied, as a percentage"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The regular-influencer price block, or null when there are none"
},
"finalTotal": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The amount the brand will be charged, all fees included, or null"
},
"creditsApplied": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Agency credits applied against the total, or null when none"
},
"ugcVideosCount": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Number of UGC videos charged, for a UGC campaign, or null"
},
"creditsAvailable": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Agency credits available to apply, or null when none"
},
"roundingAdjustment": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Invoice rounding difference applied to the total, or null"
},
"ugcAverageVideoCost": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Average cost per UGC video, for a UGC campaign, or null"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The full launch cost breakdown, mirroring the web launch dialog; present on the preview, null once acting"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Submit a campaign's final report so it is published to the brand — an outward-facing, irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Submitting notifies the brand and triggers any bonus-pool payout, and cannot be undone. Refuses a campaign whose report is already submitted. The platform restricts this to Refluenced staff and, for bonus-pool campaigns, requires every content piece rated first; any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
campaignId
The id of the campaign whose report to submit, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencersRated",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the report was submitted (true) or this is a preview only (false)."
},
"influencersRated": {
"type": "number",
"description": "How many influencers have been rated on the campaign."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "submit-campaign-report",
"title": "Submit a campaign's final report",
"description": "Submit a campaign's final report so it is published to the brand — an outward-facing, irreversible change, so it is preview-then-confirm. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected, but the preview names the brand it belongs to. Submitting notifies the brand and triggers any bonus-pool payout, and cannot be undone. Refuses a campaign whose report is already submitted. The platform restricts this to Refluenced staff and, for bonus-pool campaigns, requires every content piece rated first; any refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose report to submit, from list-campaigns, search-campaigns or get-campaign."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencersRated",
"performed"
],
"properties": {
"performed": {
"type": "boolean",
"description": "Whether the report was submitted (true) or this is a preview only (false)."
},
"influencersRated": {
"type": "number",
"description": "How many influencers have been rated on the campaign."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Switch an existing campaign's channel — between Instagram, TikTok, UGC, or Instagram and TikTok together. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Only a switchable draft can switch: the platform refuses a campaign that is no longer a draft or that already has applications. Switching a draft changes nothing outward and is reversible, so it applies directly with no confirmation. For a live campaign, duplicate it into the target type with duplicate-campaign instead. Any platform refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
campaignId
The id of the campaign whose type to switch, from list-campaigns, search-campaigns or get-campaign.
Clear enough to supply this argument.
targetType
The channel to switch the campaign to; instagram_and_tiktok means both channels at once. Only a switchable draft (one with no applications yet) can switch; a live campaign cannot.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "switch-campaign-type",
"title": "Switch a campaign's type",
"description": "Switch an existing campaign's channel — between Instagram, TikTok, UGC, or Instagram and TikTok together. Target it by campaignId (from list-campaigns, search-campaigns or get-campaign); no brand needs to be selected. Only a switchable draft can switch: the platform refuses a campaign that is no longer a draft or that already has applications. Switching a draft changes nothing outward and is reversible, so it applies directly with no confirmation. For a live campaign, duplicate it into the target type with duplicate-campaign instead. Any platform refusal is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"targetType"
],
"properties": {
"campaignId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the campaign whose type to switch, from list-campaigns, search-campaigns or get-campaign."
},
"targetType": {
"enum": [
"instagram",
"instagram_and_tiktok",
"tiktok",
"ugc"
],
"type": "string",
"description": "The channel to switch the campaign to; instagram_and_tiktok means both channels at once. Only a switchable draft (one with no applications yet) can switch; a live campaign cannot."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaign",
"message",
"performed"
],
"properties": {
"message": {
"type": "string",
"description": "A human-readable summary of the result — for a preview, what would happen and the fields still missing; once confirmed, what was written. The same text as the text block, so a client reading structured output sees it too."
},
"campaign": {
"anyOf": [
{
"type": "object",
"required": [
"brandName",
"created",
"createdBy",
"deliverables",
"id",
"media",
"platform",
"progress",
"reward",
"schedule",
"state",
"targeting",
"title",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The campaign's id"
},
"url": {
"type": "string",
"description": "The campaign's page in the Refluenced web app, for opening it in a browser"
},
"media": {
"type": "object",
"required": [
"gallery",
"image"
],
"properties": {
"image": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's main image URL, or null when none is set — set one to make the campaign publishable"
},
"gallery": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "number",
"description": "The gallery image's id"
},
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The gallery image's URL, or null"
}
},
"additionalProperties": false
},
"description": "The additional product images, in display order"
}
},
"description": "The campaign's images — the main image and the product gallery, for verifying an image upload succeeded",
"additionalProperties": false
},
"state": {
"type": "object",
"required": [
"draft",
"hasStarted",
"onGoing",
"onGoingCompleted",
"paused",
"switchable"
],
"properties": {
"draft": {
"type": "boolean",
"description": "Whether the campaign is still a draft"
},
"paused": {
"type": "boolean",
"description": "Whether an ongoing campaign is paused"
},
"onGoing": {
"type": "boolean",
"description": "Whether the campaign is ongoing rather than one-off"
},
"hasStarted": {
"type": "boolean",
"description": "Whether the campaign has started"
},
"switchable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the campaign's type can still be switched (no applications yet), or null without owner access"
},
"onGoingCompleted": {
"type": "boolean",
"description": "Whether an ongoing campaign has been ended and is now complete"
}
},
"description": "The campaign's lifecycle flags",
"additionalProperties": false
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The campaign's title, or null for an untitled draft"
},
"reward": {
"type": "object",
"required": [
"bonusPool",
"cashReward",
"highlyRatedReward",
"performanceReward",
"sellingPrice",
"speedyReward",
"type"
],
"properties": {
"type": {
"type": "string",
"description": "The reward type, e.g. PRODUCT_CASH, VOUCHER, CASH or OTHER"
},
"bonusPool": {
"type": "boolean",
"description": "Whether a bonus pool applies"
},
"cashReward": {
"type": "number",
"description": "Cash paid per influencer, in the campaign's currency"
},
"sellingPrice": {
"type": "number",
"description": "The product's selling price, in the campaign's currency"
},
"speedyReward": {
"type": "number",
"description": "Extra reward for fast delivery, in the campaign's currency"
},
"highlyRatedReward": {
"type": "number",
"description": "Extra reward for highly rated influencers, in the campaign's currency"
},
"performanceReward": {
"type": "number",
"description": "Extra reward tied to performance, in the campaign's currency"
}
},
"description": "What influencers are paid",
"additionalProperties": false
},
"created": {
"type": "string",
"description": "When the campaign was created (ISO 8601)"
},
"platform": {
"type": "object",
"required": [
"digitalShopUrl",
"event",
"instagram",
"paidPartnership",
"paidPartnershipWith",
"tiktok",
"ugc"
],
"properties": {
"ugc": {
"type": "boolean",
"description": "Whether the campaign is a UGC campaign"
},
"event": {
"type": "boolean",
"description": "Whether the campaign is an in-person event"
},
"tiktok": {
"type": "boolean",
"description": "Whether the campaign runs on TikTok"
},
"instagram": {
"type": "boolean",
"description": "Whether the campaign runs on Instagram"
},
"digitalShopUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The shop URL influencers link to, or null"
},
"paidPartnership": {
"type": "boolean",
"description": "Whether posts are labelled as paid partnerships"
},
"paidPartnershipWith": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The account the paid partnership names, or null"
}
},
"description": "Which channels the campaign runs on and how",
"additionalProperties": false
},
"progress": {
"anyOf": [
{
"type": "object",
"required": [
"activeCount",
"completedCount",
"openCount",
"overdueCount"
],
"properties": {
"openCount": {
"type": "number",
"description": "Pending applications awaiting a decision"
},
"activeCount": {
"type": "number",
"description": "Accepted influencers currently working"
},
"overdueCount": {
"type": "number",
"description": "Accepted influencers past their due date without completing"
},
"completedCount": {
"type": "number",
"description": "Accepted influencers who have finished"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Where the campaign's influencers stand right now, or null when you lack owner access to this campaign (the platform only reports the pipeline to the owning brand and admins)"
},
"schedule": {
"type": "object",
"required": [
"castingDays",
"castingStart",
"commercialDays",
"completed",
"deadline",
"preparation",
"preparationDays"
],
"properties": {
"deadline": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The application deadline (ISO 8601), or null when unset"
},
"completed": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the campaign is due to complete (ISO 8601), or null"
},
"castingDays": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "How many days casting runs for, or null without owner access"
},
"preparation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the preparation phase ends (ISO 8601), or null when unset"
},
"castingStart": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When casting opens (ISO 8601), or null when unset"
},
"commercialDays": {
"type": "number",
"description": "How many days influencers have to post"
},
"preparationDays": {
"type": "number",
"description": "How many days influencers have to prepare"
}
},
"description": "The campaign's timeline",
"additionalProperties": false
},
"brandName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand the campaign runs for, or null when unset"
},
"createdBy": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "The id of the staff member who created the campaign, or null"
},
"targeting": {
"type": "object",
"required": [
"locations",
"proInfluencer"
],
"properties": {
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "The locations the campaign targets"
},
"proInfluencer": {
"type": "boolean",
"description": "Whether only pro influencers may apply"
}
},
"description": "Who and where the campaign is aimed at",
"additionalProperties": false
},
"deliverables": {
"type": "object",
"required": [
"accountTags",
"aiRecommendations",
"brandDoes",
"contentApprovalMode",
"dontsDescription",
"hashtags",
"includeStoriesInReview",
"longDescription",
"numberOfFeedposts",
"numberOfReels",
"numberOfStories",
"numberOfTiktokMedias",
"numberOfUgc",
"revisions",
"task",
"typeOfCooperation"
],
"properties": {
"task": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The task influencers must complete, or null"
},
"hashtags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Hashtags influencers must use"
},
"brandDoes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The product description — what the brand or product does, or null"
},
"revisions": {
"type": "number",
"description": "Revisions allowed on delivered content"
},
"accountTags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Accounts influencers must tag"
},
"numberOfUgc": {
"type": "number",
"description": "UGC videos required per influencer"
},
"numberOfReels": {
"type": "number",
"description": "Reels required per influencer"
},
"longDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The full campaign brief, or null"
},
"numberOfStories": {
"type": "number",
"description": "Stories required per influencer"
},
"dontsDescription": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What creators must NOT do — the Don'ts field, for any campaign type — or null when there is none"
},
"aiRecommendations": {
"type": "boolean",
"description": "Whether the platform surfaces AI recommendations (always on under the AI review modes)"
},
"numberOfFeedposts": {
"type": "number",
"description": "Feed posts required per influencer"
},
"typeOfCooperation": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The cooperation type, or null"
},
"contentApprovalMode": {
"enum": [
"off",
"manual",
"ai_automated",
"semi_automated"
],
"type": "string",
"description": "How content is reviewed before it goes live: 'off' none, 'manual' brand reviews, 'ai_automated' AI approves/rejects, 'semi_automated' AI rejects failing and the brand approves passing"
},
"numberOfTiktokMedias": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "TikTok videos required per influencer, or null when unset"
},
"includeStoriesInReview": {
"type": "boolean",
"description": "Whether the story batch goes through content review too (only under the AI review modes)"
}
},
"description": "What each accepted influencer must produce",
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The written campaign in full once confirmed, or null for a preview where nothing was written yet."
},
"performed": {
"type": "boolean",
"description": "Whether the write was actually applied (true) or this is a preview only (false)."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Re-sync an agency to Bexio (the accounting system) by id — the manual re-sync for when an upstream Bexio record has drifted. Applies directly; admin-only platform-side. When no Bexio contact matches the agency it reports that nothing was synced (not an error); a non-admin (admin_access_required) is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
agencyId
The id of the agency to re-sync to Bexio, from list-agencies.
Clear enough to supply this argument.
disambiguated
Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"matched",
"synced"
],
"properties": {
"synced": {
"type": "boolean",
"description": "Whether the Bexio sync ran"
},
"matched": {
"type": "boolean",
"description": "Whether a Bexio contact matched the agency"
},
"agencyId": {
"type": "number",
"description": "The agency that was re-synced"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "sync-agency-bexio",
"title": "Re-sync an agency to Bexio",
"description": "Re-sync an agency to Bexio (the accounting system) by id — the manual re-sync for when an upstream Bexio record has drifted. Applies directly; admin-only platform-side. When no Bexio contact matches the agency it reports that nothing was synced (not an error); a non-admin (admin_access_required) is surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId"
],
"properties": {
"agencyId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the agency to re-sync to Bexio, from list-agencies."
},
"disambiguated": {
"type": "boolean",
"default": false,
"description": "Leave this false (the default) unless the brand or agency name was already ambiguous and the user has told you which one they mean. Brand and agency names are not unique: while false, a name matching more than one is refused with the list of matches so you can ask which they mean. Once the user has chosen, carry the chosen id with disambiguated: true on this and every following action for that same brand or agency in this conversation — resolve it once, then never ask again while acting for it."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"agencyId",
"matched",
"synced"
],
"properties": {
"synced": {
"type": "boolean",
"description": "Whether the Bexio sync ran"
},
"matched": {
"type": "boolean",
"description": "Whether a Bexio contact matched the agency"
},
"agencyId": {
"type": "number",
"description": "The agency that was re-synced"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Re-push a brand to HubSpot by its owner's user id — the manual re-sync for when an upstream HubSpot record has drifted. HubSpot sync is keyed off the company user, so this syncs the owner's company profiles; take the user id from list-brand-members (the owner/ADMIN member). Applies directly; admin-only platform-side. The platform refuses a non-company user (user_not_company) and a non-admin, surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
userId
The brand owner's (company user's) user id, from list-brand-members — the owner/ADMIN member.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"synced",
"userId"
],
"properties": {
"synced": {
"type": "boolean",
"description": "Whether the HubSpot re-sync was initiated"
},
"userId": {
"type": "number",
"description": "The user whose company profiles were re-synced"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "sync-brand-hubspot",
"title": "Re-sync a brand to HubSpot",
"description": "Re-push a brand to HubSpot by its owner's user id — the manual re-sync for when an upstream HubSpot record has drifted. HubSpot sync is keyed off the company user, so this syncs the owner's company profiles; take the user id from list-brand-members (the owner/ADMIN member). Applies directly; admin-only platform-side. The platform refuses a non-company user (user_not_company) and a non-admin, surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"userId"
],
"properties": {
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The brand owner's (company user's) user id, from list-brand-members — the owner/ADMIN member."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"synced",
"userId"
],
"properties": {
"synced": {
"type": "boolean",
"description": "Whether the HubSpot re-sync was initiated"
},
"userId": {
"type": "number",
"description": "The user whose company profiles were re-synced"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Re-push a creator to HubSpot by their influencer id — the manual re-sync for when an upstream HubSpot record has drifted. Applies directly; admin-only platform-side, and any refusal is surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Turn off all of a creator's app notifications and queue their HubSpot marketing-email unsubscribe — the admin 'unsubscribe all' action, for a creator who asked to stop hearing from the platform. This is a notification opt-out, not removal from any campaign. Applies directly, mirroring the one-click web action, and names the creator. Admin-only platform-side — a non-admin is refused, surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
{
"name": "unsubscribe-influencer-notifications",
"title": "Unsubscribe a creator from all notifications",
"description": "Turn off all of a creator's app notifications and queue their HubSpot marketing-email unsubscribe — the admin 'unsubscribe all' action, for a creator who asked to stop hearing from the platform. This is a notification opt-out, not removal from any campaign. Applies directly, mirroring the one-click web action, and names the creator. Admin-only platform-side — a non-admin is refused, surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId"
],
"properties": {
"influencerId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The influencer profile id, from search-influencer-network or get-influencer."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"influencerId",
"unsubscribed"
],
"properties": {
"influencerId": {
"type": "number",
"description": "The creator whose notifications were turned off"
},
"unsubscribed": {
"type": "boolean",
"description": "Whether all notifications were turned off"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Set a creator's Instagram handle and, for admins, their follower count and engagement rate — the edit page's Instagram group. Pass only what changes. A changed handle is validated against Instagram first (a handle already in use or not found is refused). These figures are read-only on the ordinary profile edit, so this is the tool that sets them; to re-fetch them live from Instagram instead, use refresh-influencer-instagram. Applies directly. The platform owns validity and permits it only to an admin or the creator themselves — any refusal is surfaced as-is. The updated profile is returned in full.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
engagement
The creator's Instagram engagement rate, as a percentage. Admin-only — the platform refuses others.
Clear enough to supply this argument.
followers
The creator's Instagram follower count. Admin-only — the platform refuses others.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
influencerId
The influencer profile id, from search-influencer-network or get-influencer.
Clear enough to supply this argument.
username
The creator's Instagram handle (without the @). A changed handle is validated against Instagram first.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Correct a submission's performance figures by hand — stories, posts, views, reach, sticker taps, profile views, the TikTok metrics, price deductions, and real costs — a partial update: send only the fields that change. This is the admin reporting-correction form, so it applies directly. Setting reportSubmitted true additionally locks the campaign's PPC/PPR pricing and recomputes real costs. Target it by applicationId. Admin-only: the platform refuses a non-admin, surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
applicationId
The id of the application whose report figures to correct.
Clear enough to supply this argument.
reportSubmitted
Set true to mark the report submitted — this locks the campaign's PPC/PPR pricing and recomputes the real costs. Leave unset to just correct figures.
Clear enough to supply this argument.
postReach
Unique accounts that saw the creator's feed posts; omit to leave the stored figure unchanged.
Clear enough to supply this argument.
postViews
Impressions on the creator's feed posts; omit to leave the stored figure unchanged.
Clear enough to supply this argument.
priceDeduction
Amount, in the campaign's currency, to subtract from the creator's payout for this submission.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
priceDeductionReason
A short note recorded with the deduction explaining why the creator's payout was reduced.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
profileViews
Views of the creator's profile driven by the feed posts; omit to leave the stored figure unchanged.
Clear enough to supply this argument.
reachFactor
Multiplier applied to the raw reach figures when weighting performance; the platform uses 1 when omitted.
Clear enough to supply this argument.
realCost
Actual cost of the submission, in the campaign's currency, overriding the platform's computed cost; omit to keep the computed value.
Clear enough to supply this argument.
realCostClicks
Actual cost per click, in the campaign's currency, overriding the computed value.
Clear enough to supply this argument.
realCostReach
Actual cost per unit of reach, in the campaign's currency, overriding the computed value.
Clear enough to supply this argument.
stickerTaps
Taps on interactive stickers in the creator's stories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
storyLinkClicks
Clicks on the link sticker in the creator's stories.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
storyReach
Unique accounts that saw the creator's stories.
Clear enough to supply this argument.
storyViews
Views of the creator's stories.
Clear enough to supply this argument.
tiktokAverageWatchTime
Average time viewers watched the TikTok video, in seconds.
Clear enough to supply this argument.
tiktokCollectCount
Saves (collects) of the TikTok video.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokCommentCount
Comments on the TikTok video.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokDiggCount
Likes (diggs) on the TikTok video.
Clear enough to supply this argument.
tiktokPlayCount
Times the TikTok video was played.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tiktokProfileViews
Views of the creator's TikTok profile driven by the video.
Clear enough to supply this argument.
tiktokReachedAudience
Unique accounts reached by the TikTok video.
Clear enough to supply this argument.
tiktokShareCount
Shares of the TikTok video.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
totalPosts
Feed posts the creator delivered for this submission.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
totalStories
Stories the creator delivered for this submission.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Upgrade an existing subscription to a higher plan — the brand-side /plans/ upgrade. Pass the subscriptionId (from get-subscription or get-agency) and the target packageId (from list-plans). This is an in-place, prorated Stripe change charged to the saved card immediately — no redirect. Preview-then-confirm, mirroring the web's cost/proration modal: with confirm false it does nothing and returns the new plan's recurring price so you can show the cost, plus the current plan to compare against from get-subscription; the exact prorated top-up charged today settles on the Stripe invoice (the web app does not preview it either). Downgrades are refused (package_downgrade_not_allowed), as is switching a yearly plan to monthly (invalid_package_type); an admin-assigned subscription can only be upgraded by an admin. Refusals are surfaced as-is.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
packageId
The plan to upgrade to, from list-plans. Must not be a downgrade.
Clear enough to supply this argument.
packageType
The billing period for the new plan. Switching a yearly plan to monthly is refused.
Clear enough to supply this argument.
subscriptionId
The id of the subscription to upgrade, from get-subscription or get-agency.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"preview",
"subscription",
"targetPlan"
],
"properties": {
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen, to state back to the user; else null."
},
"performed": {
"type": "boolean",
"description": "Whether the upgrade was applied (true) or this is a preview only (false)."
},
"targetPlan": {
"anyOf": [
{
"type": "object",
"required": [
"currency",
"discountPercentage",
"id",
"name",
"recurringPrice",
"recurringPriceListed"
],
"properties": {
"id": {
"type": "number",
"description": "The target plan's id"
},
"name": {
"type": "string",
"description": "The target plan's name, e.g. EXPERT"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"recurringPrice": {
"type": "number",
"description": "The new recurring price for the chosen billing period, after any discount — what is billed each period"
},
"discountPercentage": {
"type": "number",
"description": "The discount applied to the plan's list price, 0 when none"
},
"recurringPriceListed": {
"type": "number",
"description": "The plan's list price for the chosen billing period, before any discount"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "On a preview, the new plan and its recurring price so the cost can be shown; null once confirmed."
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The upgraded subscription once confirmed, or null for a preview."
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "upgrade-plan",
"title": "Upgrade a subscription plan",
"description": "Upgrade an existing subscription to a higher plan — the brand-side /plans/ upgrade. Pass the subscriptionId (from get-subscription or get-agency) and the target packageId (from list-plans). This is an in-place, prorated Stripe change charged to the saved card immediately — no redirect. Preview-then-confirm, mirroring the web's cost/proration modal: with confirm false it does nothing and returns the new plan's recurring price so you can show the cost, plus the current plan to compare against from get-subscription; the exact prorated top-up charged today settles on the Stripe invoice (the web app does not preview it either). Downgrades are refused (package_downgrade_not_allowed), as is switching a yearly plan to monthly (invalid_package_type); an admin-assigned subscription can only be upgraded by an admin. Refusals are surfaced as-is.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"packageId",
"packageType",
"subscriptionId"
],
"properties": {
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"packageId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The plan to upgrade to, from list-plans. Must not be a downgrade."
},
"packageType": {
"enum": [
"MONTHLY",
"YEARLY"
],
"type": "string",
"description": "The billing period for the new plan. Switching a yearly plan to monthly is refused."
},
"subscriptionId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The id of the subscription to upgrade, from get-subscription or get-agency."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"performed",
"preview",
"subscription",
"targetPlan"
],
"properties": {
"preview": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "On a preview (confirm false), the description of what would happen, to state back to the user; else null."
},
"performed": {
"type": "boolean",
"description": "Whether the upgrade was applied (true) or this is a preview only (false)."
},
"targetPlan": {
"anyOf": [
{
"type": "object",
"required": [
"currency",
"discountPercentage",
"id",
"name",
"recurringPrice",
"recurringPriceListed"
],
"properties": {
"id": {
"type": "number",
"description": "The target plan's id"
},
"name": {
"type": "string",
"description": "The target plan's name, e.g. EXPERT"
},
"currency": {
"type": "string",
"description": "The currency the plan is priced in"
},
"recurringPrice": {
"type": "number",
"description": "The new recurring price for the chosen billing period, after any discount — what is billed each period"
},
"discountPercentage": {
"type": "number",
"description": "The discount applied to the plan's list price, 0 when none"
},
"recurringPriceListed": {
"type": "number",
"description": "The plan's list price for the chosen billing period, before any discount"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "On a preview, the new plan and its recurring price so the cost can be shown; null once confirmed."
},
"subscription": {
"anyOf": [
{
"type": "object",
"required": [
"buyout",
"buyoutUsed",
"campaignsLeft",
"currency",
"id",
"isAdminAssigned",
"packageType",
"paymentStatus",
"plan",
"recurring",
"seatsLeft",
"validFrom",
"validUntil"
],
"properties": {
"id": {
"type": "number",
"description": "The subscription's id"
},
"plan": {
"type": "string",
"description": "The plan's name, e.g. PROFESSIONAL, ENTERPRISE"
},
"buyout": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Total buyout allowance for the plan, or null when unlimited"
},
"currency": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The subscription's currency, or null when unset"
},
"recurring": {
"type": "boolean",
"description": "Whether the subscription renews automatically"
},
"seatsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Sub-brand seats remaining on the plan, or null when unlimited"
},
"validFrom": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription became valid (ISO 8601), or null"
},
"buyoutUsed": {
"type": "number",
"description": "How much of the buyout allowance has been used"
},
"validUntil": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "When the subscription is valid until (ISO 8601), or null"
},
"packageType": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The billing period, e.g. MONTHLY, YEARLY, or null when unset"
},
"campaignsLeft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Campaigns remaining on the plan, or null when unlimited"
},
"paymentStatus": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The payment status, e.g. PAID, TRIALING, UNPAID, or null. Admin-assigned plans are invoiced rather than charged through Stripe, so a PENDING or null status on them is expected, not an unpaid warning."
},
"isAdminAssigned": {
"type": "boolean",
"description": "Whether the subscription was assigned by an admin (bypassing payment) rather than purchased"
}
},
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The upgraded subscription once confirmed, or null for a preview."
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Check whether a TikTok handle exists on TikTok and is not already in use on the platform — the TikTok twin of the Instagram handle check. Use it before setting a creator's (or brand's, with checkForBrands) TikTok handle. Returns valid true when the handle is free to use; valid false with a reason when no such TikTok account exists or the handle is already taken.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
checkForBrands
Check the handle against brand (company) profiles instead of creator accounts; when omitted, it checks against creator accounts.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reason",
"username",
"valid"
],
"properties": {
"valid": {
"type": "boolean",
"description": "Whether the handle exists on TikTok and is not already in use"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the handle is unavailable, or null when it is available"
},
"username": {
"type": "string",
"description": "The handle that was validated"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "validate-tiktok-username",
"title": "Validate a TikTok handle",
"description": "Check whether a TikTok handle exists on TikTok and is not already in use on the platform — the TikTok twin of the Instagram handle check. Use it before setting a creator's (or brand's, with checkForBrands) TikTok handle. Returns valid true when the handle is free to use; valid false with a reason when no such TikTok account exists or the handle is already taken.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"username"
],
"properties": {
"username": {
"type": "string",
"description": "The TikTok handle to validate, without the @."
},
"checkForBrands": {
"type": "boolean",
"default": false,
"description": "Check the handle against brand (company) profiles instead of creator accounts; when omitted, it checks against creator accounts."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"reason",
"username",
"valid"
],
"properties": {
"valid": {
"type": "boolean",
"description": "Whether the handle exists on TikTok and is not already in use"
},
"reason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why the handle is unavailable, or null when it is available"
},
"username": {
"type": "string",
"description": "The handle that was validated"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Verify or un-verify a creator on Instagram, TikTok or UGC, by their userId (from get-influencer or search-influencer-network) — the edit page's admin Verifications panel. Pass the desired state as verified (true to verify, false to un-verify). This is outward-facing — it notifies the creator by push/SMS — so it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to apply. Idempotent: it reads the current state and acts only when it differs (two of the three channels toggle). Admin-only platform-side; any refusal is surfaced as-is. To reject a verification with a reason instead of silently un-verifying, use reject-influencer-verification.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
channel
Which channel's verification to set.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
confirm
Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call.
Clear enough to supply this argument.
userId
The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId.
Clear enough to supply this argument.
verified
The desired state: true to verify the creator on that channel, false to un-verify.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"performed",
"userId",
"verified"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "The channel that was targeted"
},
"verified": {
"type": "boolean",
"description": "The creator's verification state on that channel after this call (or the intended state on a preview)"
},
"performed": {
"type": "boolean",
"description": "Whether a change was actually applied (false for a preview or an already-set state)"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "verify-influencer-channel",
"title": "Verify or un-verify an influencer's channel",
"description": "Verify or un-verify a creator on Instagram, TikTok or UGC, by their userId (from get-influencer or search-influencer-network) — the edit page's admin Verifications panel. Pass the desired state as verified (true to verify, false to un-verify). This is outward-facing — it notifies the creator by push/SMS — so it is preview-then-confirm: called with confirm false (the default) it only previews; set confirm true to apply. Idempotent: it reads the current state and acts only when it differs (two of the three channels toggle). Admin-only platform-side; any refusal is surfaced as-is. To reject a verification with a reason instead of silently un-verifying, use reject-influencer-verification.",
"inputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"userId",
"verified"
],
"properties": {
"userId": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The creator's user-account (BaseUser) id — the userId from get-influencer or search-influencer-network, NOT the influencerId."
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "Which channel's verification to set."
},
"confirm": {
"type": "boolean",
"default": false,
"description": "Whether to actually perform this write. Defaults to false, which performs no change and instead returns a preview of exactly what would happen, naming the brand it is for, to state back to the user. Only set true once the user has seen that preview and confirmed — never on the first call."
},
"verified": {
"type": "boolean",
"description": "The desired state: true to verify the creator on that channel, false to un-verify."
}
}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"channel",
"performed",
"userId",
"verified"
],
"properties": {
"userId": {
"type": "number",
"description": "The creator's user-account (BaseUser) id"
},
"channel": {
"enum": [
"instagram",
"tiktok",
"ugc"
],
"type": "string",
"description": "The channel that was targeted"
},
"verified": {
"type": "boolean",
"description": "The creator's verification state on that channel after this call (or the intended state on a preview)"
},
"performed": {
"type": "boolean",
"description": "Whether a change was actually applied (false for a preview or an already-set state)"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Report the signed-in Refluenced person and the brands and agencies they belong to, so a non-admin can find their own brand or agency id without pasting it from a web URL. Use the returned ids with the brand- and agency-scoped tools (get-brand, list-campaigns, list-agency-payment-cards, …). A person may belong to no brand or agency (e.g. an administrator), in which case those lists are empty and the brands are found with list-brands.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"accessLevel",
"agencies",
"brands",
"email",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The person's full name"
},
"email": {
"type": "string",
"description": "The person's email address"
},
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyName",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id, passed to brand-scoped tools (e.g. get-brand, list-campaigns)"
},
"name": {
"type": "string",
"description": "The brand's name"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is on file"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
}
},
"additionalProperties": false
},
"description": "The brands this person belongs to, empty when they belong to none"
},
"agencies": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id, passed to agency-scoped tools (e.g. get-agency, list-brands)"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
"description": "The agencies this person belongs to, empty when they belong to none"
},
"accessLevel": {
"type": "string",
"description": "The person's access level on the platform, e.g. COMPANY_ADMIN, AGENCY or SINGLE_BRAND"
}
},
"additionalProperties": false
}
Original tool metadata
{
"name": "whoami",
"title": "Who am I",
"description": "Report the signed-in Refluenced person and the brands and agencies they belong to, so a non-admin can find their own brand or agency id without pasting it from a web URL. Use the returned ids with the brand- and agency-scoped tools (get-brand, list-campaigns, list-agency-payment-cards, …). A person may belong to no brand or agency (e.g. an administrator), in which case those lists are empty and the brands are found with list-brands.",
"inputSchema": {
"type": "object",
"properties": {}
},
"outputSchema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"accessLevel",
"agencies",
"brands",
"email",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "The person's full name"
},
"email": {
"type": "string",
"description": "The person's email address"
},
"brands": {
"type": "array",
"items": {
"type": "object",
"required": [
"agencyName",
"id",
"name",
"website"
],
"properties": {
"id": {
"type": "number",
"description": "The brand's id, passed to brand-scoped tools (e.g. get-brand, list-campaigns)"
},
"name": {
"type": "string",
"description": "The brand's name"
},
"website": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The brand's website, or null when none is on file"
},
"agencyName": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "The agency this brand belongs to, or null when it belongs to none"
}
},
"additionalProperties": false
},
"description": "The brands this person belongs to, empty when they belong to none"
},
"agencies": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "number",
"description": "The agency's id, passed to agency-scoped tools (e.g. get-agency, list-brands)"
},
"name": {
"type": "string",
"description": "The agency's name"
}
},
"additionalProperties": false
},
"description": "The agencies this person belongs to, empty when they belong to none"
},
"accessLevel": {
"type": "string",
"description": "The person's access level on the platform, e.g. COMPANY_ADMIN, AGENCY or SINGLE_BRAND"
}
},
"additionalProperties": false
},
"annotations": {
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Browse campaigns across brandsBrowse campaigns across every brand by property, the way the platform's campaign list page does.
02Render a chart in Refluenced's paletteDraw a chart in Refluenced's brand palette and return it as a view, so every chart in the conversation looks like it came from Refluenced.
03Search campaignsFind campaigns across every brand by title (campaignName) or by brand/company name (brandName); pass at least one.
04Search the influencer networkSearch Refluenced's whole influencer network to find creators to invite to a campaign.
05Search trending hashtagsRank the hashtags creators use most, across the platform's harvested social content — a discovery companion to search-influencer-network.
Want to run these tasks against your MCP server with us?
Refluenced setup, tools, quality score, publishing readiness, and alternatives.
How do I add Refluenced to Claude, ChatGPT, or Cursor?
Add Refluenced to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp-internal.refluenced.com/mcp.
Is Refluenced MCP ready for ChatGPT and Claude?
As of November 5, 2026, Refluenced scores 100/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Refluenced's MCP tool documentation?
As of November 5, 2026, Refluenced scores 94/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 233 of 233 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to Refluenced?
As of November 5, 2026, alternatives to Refluenced in marketing-seo on the Manufact MCP leaderboard include Brave URL Submitter, Buzzfy, Brave URL Submitter, OpenAffiliate, and Airefs AI Visibility.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.