MCP tools to find and hire Instagram and TikTok creators from a plain-language brief.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Add a creator as a manual match to a campaign by profileId, with its fitScore. Idempotent on (campaign, profileId). Stores the platform, handle, name, picture, and follower count of the catalog profile, so the input carries nothing else, and any other key, platform or username included, fails the call with a validation error; a profileId with no catalog profile returns not_found. While a send request is open, once the campaign is sent, or while it is archived, it returns a tool error naming the reason. Needs a credential.
Fit score from search_creators, 0 to 1, or null when unknown
Creator profile id from search_creators
Campaign id from list_campaigns
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Add a creator as a manual match to a campaign by profileId, with its fitScore. Idempotent on (campaign, profileId). Stores the platform, handle, name, picture, and follower count of the catalog profile, so the input carries nothing else, and any other key, platform or username included, fails the call with a validation error; a profileId with no catalog profile returns not_found. While a send request is open, once the campaign is sent, or while it is archived, it returns a tool error naming the reason. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| fitScore* | any | Fit score from search_creators, 0 to 1, or null when unknown |
| profileId* | string | Creator profile id from search_creators |
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"fitScore",
"profileId",
"campaignId"
],
"properties": {
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
},
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Add several creators as manual matches to a campaign in one call. Each creator is a profileId and fitScore pick: the id and fitScore of a search_creators creator, or the profileId and fitScore of a get_list creator. Idempotent on (campaign, profileId). Stores the platform, handle, name, picture, and follower count of each catalog profile, so a creator carries nothing else, and any other key on a creator fails the call with a validation error. A profileId outside the catalog fails the call with a tool error naming it, and nothing is added. Returns added, the count of new matches, and present, the count already on the campaign, with addedCreators and presentCreators, the same counts per person, so a person with two matched profiles counts once. A campaign outside the caller's organization returns not_found. While a send request is open, once the campaign is sent, or while it is archived, it returns a tool error naming the reason. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| creators* | array | The creators to add to the campaign: the profileId and fitScore of each, the id and fitScore of a search_creators creator or the profileId and fitScore of a get_list creator |
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"creators"
],
"properties": {
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"fitScore",
"profileId"
],
"properties": {
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "The creators to add to the campaign: the profileId and fitScore of each, the id and fitScore of a search_creators creator or the profileId and fitScore of a get_list creator"
},
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Mint a new API key. Returns the plaintext key once; it is not shown again. The new key is an ordinary key of the same member, not a child of the minting key: revoking the minting key leaves it working. Needs a credential other than an agent access token or an OAuth access token.
| Argument | Type | Description |
|---|---|---|
| name* | string | Key label; must not start with agent: |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 64,
"description": "Key label; must not start with agent:"
}
},
"additionalProperties": true
}Create a campaign with a goal (what to advertise or attain). A campaign opens only to its organization until its proposals are sent, at no charge. It is public and free by default, which opens it to any identified caller once sent; setting visibility "private" costs 1 credit and keeps it to the organization after the send. Contract (deliverable, compensationCents, and platforms, the platforms one payment covers), creator posting date, campaign details declassifying date (embargoUntil), disclosure, and marketInformation are accepted. Optional creators, each a profileId and fitScore pick, adds them as manual matches in the same call, as add_campaign_matches does, and the result carries matches with the added and present counts; any other key on a creator fails the call with a validation error; a creator id outside the catalog fails the call before anything is created or charged. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| goal* | string | Campaign goal |
| name* | string | Campaign name |
| contract | object | Compensation in USD cents, the paid deliverable, the platforms the creator posts on, and optional creator posting date. |
| creators | array | Creators to add to the new campaign: the profileId and fitScore of each, the id and fitScore of a search_creators creator or the profileId and fitScore of a get_list creator |
| disclosure | object | Paid partnership disclosure. Required before send. |
| visibility |
Delete a campaign and its matches. A funded campaign, a campaign with a signed hire, or a campaign with a proposal delivery returns a tool error naming the reason. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Delete one file attached to a campaign of the caller's organization. Irreversible. An attachment or a campaign outside the caller's organization returns not_found. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
| attachmentId* | string | Attachment id from list_campaign_attachments |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"attachmentId",
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
},
"attachmentId": {
"type": "string",
"minLength": 1,
"description": "Attachment id from list_campaign_attachments"
}
},
"additionalProperties": true
}Delete one List of the caller's organization and its saved creators. Campaigns keep the creators added from it. Irreversible. A List outside the caller's organization returns not_found. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| listId* | string | List id from list_lists |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"minLength": 1,
"description": "List id from list_lists"
}
},
"additionalProperties": true
}Run shortlist AI enrichment (niche, celebrity, evidence, signal) for creators from search_creators. It takes the same creators array, query string (search query.q), and the shortlistId search_creators returned with them. Returns one analysis object per creatorId. A shortlistId works once, for 4 hours, and only for the caller who searched; enrichment spends no credits. Holds the call open until the result, up to 800 seconds.
| Argument | Type | Description |
|---|---|---|
| query* | string | The query.q string returned by search_creators |
| creators* | array | The creators array exactly as returned by search_creators, unmodified; the shortlist is bound to it |
| shortlistId* | string | The shortlistId search_creators returned with these creators |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"creators",
"query",
"shortlistId"
],
"properties": {
"query": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 200,
"description": "The query.q string returned by search_creators"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"bio",
"country",
"fitScore",
"followerCount",
"id",
"isVerified",
"name",
"platform",
"profileImageUrl",
"tier",
"username",
"videos"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"bio": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"tier": {
"enum": [
"nano",
"micro",
"mid",
"macro",
"mega"
],
"type": "string"
},
"emails": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"default": [],
"description": "Contact addresses for this organization after Reveal contact. Empty until then."
},
"videos": {
"type": "array",
"items": {
"type": "object",
"required": [
"bunnyStreamId",
"caption",
"commentCount",
"id",
"isAd",
"isSponsored",
"likeCount",
"playCount",
"playUrl",
"postedAt",
"score",
"thumbnailUrl",
"webUrl"
],
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"isAd": {
"type": "boolean"
},
"score": {
"type": "number"
},
"webUrl": {
"type": "string",
"format": "uri"
},
"caption": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Video caption, truncated to the first 500 characters."
},
"playUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Signed video URL. It expires within 24 hours. Search again for a new URL."
},
"postedAt": {
"type": "string",
"format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$"
},
"likeCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"playCount": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
]
},
"isSponsored": {
"type": "boolean"
},
"commentCount": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"thumbnailUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
],
"description": "Signed thumbnail URL. It expires within 24 hours. Search again for a new URL."
},
"bunnyStreamId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"bunnyThumbnailFile": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
}
},
"country": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"fitScore": {
"type": "number",
"maximum": 1,
"minimum": 0
},
"platform": {
"enum": [
"ig",
"tt"
],
"type": "string"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"hasContact": {
"type": "boolean",
"default": false,
"description": "True when a contact address exists. The address is omitted until this organization reveals it."
},
"isVerified": {
"type": "boolean"
},
"externalUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"averageViews": {
"anyOf": [
{
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Mean views of the creator's 6 newest posts with a stored video, counting the posts that have views. Null when none of them has views."
},
"followerCount": {
"type": "integer",
"allOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"maximum": 2147483647,
"minimum": -2147483648
}
],
"minimum": 1000
},
"profileImageUrl": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"engagementOnViews": {
"anyOf": [
{
"type": "number",
"minimum": 0
},
{
"type": "null"
}
],
"description": "Mean of likes plus comments per view over the same posts as averageViews. Null when none of them has views."
}
},
"additionalProperties": true
},
"maxItems": 100,
"minItems": 1,
"description": "The creators array exactly as returned by search_creators, unmodified; the shortlist is bound to it"
},
"shortlistId": {
"type": "string",
"minLength": 1,
"description": "The shortlistId search_creators returned with these creators"
}
},
"additionalProperties": true
}Export a campaign as CSV (Rank, Handle, Name, Platform, Followers, Fit, Source). Same access as get_campaign. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Generate creator matches from the campaign goal. Runs one creator search (same daily grant and prepaid credits as search_creators; pre-claim agent tokens spend prepaid credits only) and saves matches; idempotent on (campaign, profileId). Optional filters narrow the search. Holds the call open until the result, up to 800 seconds. While a send request is open, once the campaign is sent, or while it is archived, it returns a tool error naming the reason before any search runs. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| tier | string | Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one. |
| country | string | One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca |
| platform | string | Instagram (ig) or TikTok (tt), in either letter case |
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"tier": {
"type": "string",
"allOf": [
{
"enum": [
"nano",
"micro",
"mid",
"macro",
"mega",
"nano+",
"micro+",
"mid+",
"macro+",
"micro-",
"mid-",
"macro-"
]
}
],
"description": "Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one."
},
"country": {
"type": "string",
"pattern": "^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$",
"description": "One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca"
},
"platform": {
"type": "string",
"allOf": [
{
"enum": [
"ig",
"tt"
]
}
],
"description": "Instagram (ig) or TikTok (tt), in either letter case"
},
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Get one campaign and its matched creators. Ordinary public campaigns whose proposals are sent are free to read for any identified caller. A private campaign, and any campaign whose proposals are not yet sent, reads as not found for a caller outside the organization. Contract, creator posting date, campaign details declassifying date, and disclosure are present for members of the organization and may be null on open and summary reads. For members of the organization, people lists each person on the campaign once, with their profiles, their answer to the proposal, their funding (requested or funded), and their signed hire with the payout amount, paidAt (null while the payout is pending), and posts, each live post Starcovery recorded with its link, viewCount, and engagementCount (likes plus comments); people also lists a hire that matches no creator on the campaign, and is null for other callers. Hires and payouts are counted in people. For members of the organization, nextStep names the step the web app shows next, as list_campaigns does; it is null for other callers and once no step is left. currentSteps lists every step under way in campaign order in the same shape, because a step before nextStep can still wait, such as proposals Starcovery has not sent; currentSteps, not nextStep or status, tells whether a step is finished. It is null for other callers and empty once no step is left. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Read the prepaid credit balance, the identified daily search grant status, and whether a card is on file. Does not start checkout or change payment settings. Needs a credential.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Get one List of the caller's organization with its brief, filters, and saved creators, best fit first. The creators carry the saved creator shape that intersect_lists takes. add_campaign_matches, create_campaign, and save_list take only the profileId and fitScore of each. A List outside the caller's organization returns not_found. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| listId* | string | List id from list_lists |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"listId"
],
"properties": {
"listId": {
"type": "string",
"minLength": 1,
"description": "List id from list_lists"
}
},
"additionalProperties": true
}Keep the creators that appear in both lists, in the order of the left list. Nothing is stored. A search_creators result maps to the saved creator shape: profileId is the creator id, and fitScore, followerCount, name, platform, profileImageUrl, and username carry over. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| left* | array | First creator list; the result keeps this order |
| right* | array | Second creator list |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"left",
"right"
],
"properties": {
"left": {
"type": "array",
"items": {
"type": "object",
"required": [
"fitScore",
"followerCount",
"name",
"platform",
"profileId",
"profileImageUrl",
"username"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Creator display name, or null"
},
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"platform": {
"enum": [
"ig",
"tt"
],
"type": "string",
"description": "ig for Instagram or tt for TikTok"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Creator handle from search_creators, or null"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
},
"followerCount": {
"type": "integer",
"allOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"maximum": 2147483647,
"minimum": -2147483648
}
],
"minimum": 1000,
"description": "Follower count at snapshot time, at least 1000"
},
"profileImageUrl": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"description": "Portrait URL from search_creators, or null"
}
},
"additionalProperties": true
},
"minItems": 1,
"description": "First creator list; the result keeps this order"
},
"right": {
"type": "array",
"items": {
"type": "object",
"required": [
"fitScore",
"followerCount",
"name",
"platform",
"profileId",
"profileImageUrl",
"username"
],
"properties": {
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Creator display name, or null"
},
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"platform": {
"enum": [
"ig",
"tt"
],
"type": "string",
"description": "ig for Instagram or tt for TikTok"
},
"username": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Creator handle from search_creators, or null"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
},
"followerCount": {
"type": "integer",
"allOf": [
{
"maximum": 9007199254740991,
"minimum": -9007199254740991
},
{
"maximum": 2147483647,
"minimum": -2147483648
}
],
"minimum": 1000,
"description": "Follower count at snapshot time, at least 1000"
},
"profileImageUrl": {
"anyOf": [
{
"type": "string",
"maxLength": 2048
},
{
"type": "null"
}
],
"description": "Portrait URL from search_creators, or null"
}
},
"additionalProperties": true
},
"minItems": 1,
"description": "Second creator list"
}
},
"additionalProperties": true
}List API keys for the active organization (id, name, prefix, timestamps). An owner or admin sees every key; a member sees only the keys they minted. Never returns plaintext keys. Needs a credential other than an agent access token or an OAuth access token.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}List the files attached to a campaign of the caller's organization, with id, filename, content type, byte size, and upload time. Returns no file contents. A campaign outside the caller's organization returns not_found. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}List the caller's campaigns with goal, status, visibility, match counts, and nextStep: the step the web app shows next, with its id, label, actor (you for the organization, starcovery, creators, or one creator by name), and line, the sentence that says what the step waits on. nextStep is null once no step is left: the campaign is done or archived, or no creator was reached or accepted. Needs a credential.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}List the organization's saved Lists with brief, filters, creatorCount (each person once), itemCount (each saved profile), and last update. Needs a credential.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Remove one matched creator from a campaign by match id. A match that already has a proposal delivery, or any match while a send request is open, once the campaign is sent, or while it is archived, returns a tool error naming the reason. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| matchId* | string | Match id from get_campaign |
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId",
"matchId"
],
"properties": {
"matchId": {
"type": "string",
"minLength": 1,
"description": "Match id from get_campaign"
},
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Request campaign funding for a campaign the caller's organization owns. Starcovery Payouts runs concierge: this call records one open funding request for the accepted creators not yet funded, per person, with the quoted total (compensation per creator times those people, plus the platform fee that the market information answer sets), and notifies the Starcovery team, who invoice the organization. Only organization owners and admins may call it. Needs a saved contract, an answered market information question, and at least one creator who accepted and is not yet funded. Returns a tool error naming the reason when the campaign is not the caller's, it is archived, a step is missing, or a request is already open. An archived campaign is funded only after it is reopened with update_campaign status active. The reason creators_changed means a creator accepted while the request was prepared; the same call then succeeds. Returns the request row with amountCents set to the quoted total. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Request a proposal send for a draft campaign the caller's organization owns. Starcovery Proposals runs concierge: this call records one open send request and notifies the Starcovery team, who send the proposals from the staff queue. Needs a saved contract whose creator posting date, when set, is today or a later day in UTC, a captured disclosure, and at least one match. Returns a tool error naming the reason when the campaign is not the caller's, a step is missing, a request is already open, or the campaign is already sent. Returns the request row. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| campaignId* | string | Campaign id from list_campaigns |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": true
}Reveal a creator contact address. Costs 5 prepaid credits the first time this organization reveals that profile. Later calls return the address without charging. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| profileId* | string | Creator profile id from search_creators |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"profileId"
],
"properties": {
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
}
},
"additionalProperties": true
}Revoke an API key by id. An owner or admin revokes any key of the organization; a member revokes only a key they minted, and another key returns not_found. Irreversible, and touches only that key: keys minted with it stay enabled until revoked by id. Needs a credential other than an agent access token or an OAuth access token.
| Argument | Type | Description |
|---|---|---|
| keyId* | string | API key id from list_api_keys |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"keyId"
],
"properties": {
"keyId": {
"type": "string",
"minLength": 1,
"description": "API key id from list_api_keys"
}
},
"additionalProperties": true
}Save a set of creators as a List for the organization, with the brief and filters of the search that produced it. The List takes the name in name, or a name cut from the brief when name is omitted, with a number from 2 appended when another List of the organization holds that name. Each creator is a profileId and fitScore pick: profileId is the creator id from search_creators, and fitScore its fit. The List stores the platform, handle, name, picture, and follower count of each catalog profile, so a creator carries nothing else, and any other key on a creator fails the call with a validation error. A profileId outside the catalog fails the call with a tool error naming it, and no List is saved. Returns the saved List summary. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| q* | string | Natural-language creator brief |
| name | string | Campaign name |
| tier | string | Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one. |
| country | string | One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca |
| creators* | array | The creators to keep on the List: the profileId and fitScore of each |
Search Instagram and TikTok creators with a natural-language brief. Returns up to 50 ranked creators with fit score, follower count, platform, the 3 best-matching videos, and a shortlistId for enrich_creators when available. Bios and captions are cut to 150 characters. The creator's website link is returned as written, or null when it is longer than 200 characters. Every other link is a short link that redirects for 24 hours. When the result would pass 140,000 characters, the lowest ranked creators are left out until it fits. The brief in q sets no filter; platform, country, and tier filter. Contact addresses stay empty until reveal_contact. Holds the call open until the result, up to 800 seconds. Each search is one use. Unsigned callers get 100 uses per rolling 24 hours per IP. Identified callers get 200 uses per rolling 24 hours, then prepaid credits. Pre-claim agent tokens skip the daily grant and use prepaid credits only. enrich_creators takes these creators, query.q, and shortlistId for niche, evidence, and signal analysis.
| Argument | Type | Description |
|---|---|---|
| q* | string | Natural-language creator brief |
| tier | string | Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one. |
| country | string | One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca |
| platform | string | Instagram (ig) or TikTok (tt), in either letter case |
Run the next turn of a search thread and return the settled brief, its filters, the operations the turn ran, the reply, and the creators of the thread result set with a shortlistId for enrich_creators. creatorCount counts the whole set; creators holds at most the 50 best fit of them, fewer when the result would pass 140,000 characters. The reply, statement, and error are cut to 4,000 characters, and operations lists at most the first 20. Without threadId the call opens a new thread; the threadId in the result is the durable handle for the next turn. A pasted website address is read into a brief; anything else refines the brief, or answers a question about the organization's campaigns, Lists, credits, or API keys from read tools without changing them. Sends notifications/progress when the caller passes a progressToken. MCP cannot stream a tool result, so the call is blocking and waits until the turn ends, up to 800 seconds. Each turn costs 1 use plus 1 for each search and each exclusion it runs, from the same daily grant as search_creators and then 1 prepaid credit each. A refinement returns the set it built; the first brief runs one search for its creators, billed like search_creators. The thread stores the set, so reading it again with GET /api/threads/{threadId}/results is free. When the allowance runs out, exhausted is set and creators is empty; a turn that finds it spent runs nothing. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| message* | string | The turn text: what to search for, what to change in the running search, or a website address to read into a brief |
| threadId | string | Thread id from a previous call. Omit to open a new thread |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 2000,
"description": "The turn text: what to search for, what to change in the running search, or a website address to read into a brief"
},
"threadId": {
"type": "string",
"minLength": 1,
"description": "Thread id from a previous call. Omit to open a new thread"
}
},
"additionalProperties": true
}Update campaign fields: name, goal, visibility, or status (draft, archived, or active; Starcovery sets active when the team sends the proposals, and active reopens an archived campaign whose proposals were sent). A campaign that is active or holds a delivery cannot return to draft, a campaign with an open send or funding request cannot be archived, and a campaign that is not archived or was never sent cannot be set active; each change returns a tool error naming the reason. Changing visibility to private costs 1 credit; already-private updates do not. Contract (deliverable, compensationCents, and platforms, the platforms one payment covers), creator posting date, campaign details declassifying date (embargoUntil), disclosure, and marketInformation are accepted. Null marketInformation clears it. While a funding request is open or the campaign holds funds, a changed or cleared marketInformation returns a tool error naming the reason; a campaign whose reserve was refunded to zero takes a new answer. After Starcovery sends the proposals, a changed or cleared contract returns a tool error naming the reason, and a call without contract still changes the other fields. Needs a credential.
| Argument | Type | Description |
|---|---|---|
| goal | string | Campaign goal |
| name | string | Campaign name |
| status | string | draft, archived, or active. Starcovery sets active when the team sends the proposals; active reopens an archived campaign whose proposals were sent. |
| contract | any | Null clears stored contract metadata. A stored declassifying date needs a contract, so clear embargoUntil in the same patch. |
Show the current credential, the bound user and organization, and whether the next search draws from the user daily grant or the organization balance. Needs a credential.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}| string |
| Defaults to public, which opens the campaign to anyone signed in once its proposals are sent. Private costs 1 credit and keeps it to the organization after the send. Before the send, only the organization opens it either way. |
| embargoUntil | string | Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. It needs a contract in the same request. Omit when unset. |
| idempotencyKey | string | Client-generated key. A valid repeat with the same key answers with the campaign the first call created, even when its other fields differ. |
| marketInformation | object | When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"goal",
"name"
],
"properties": {
"goal": {
"type": "string",
"allOf": [
{
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 200,
"description": "Campaign goal: audience, brand vibe, or objective. Used as the generate search brief."
}
],
"description": "Campaign goal"
},
"name": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 100,
"description": "Campaign name"
},
"contract": {
"type": "object",
"required": [
"compensationCents",
"deliverable",
"platforms"
],
"properties": {
"platforms": {
"type": "array",
"items": {
"enum": [
"ig",
"tt"
],
"type": "string"
},
"maxItems": 2,
"minItems": 1,
"description": "Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."
},
"deliverable": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 2000
},
"compensationCents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"creatorPostingDate": {
"type": "string",
"format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$",
"description": "Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."
}
},
"description": "Compensation in USD cents, the paid deliverable, the platforms the creator posts on, and optional creator posting date.",
"additionalProperties": false
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"fitScore",
"profileId"
],
"properties": {
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "Creators to add to the new campaign: the profileId and fitScore of each, the id and fitScore of a search_creators creator or the profileId and fitScore of a get_list creator"
},
"disclosure": {
"type": "object",
"required": [
"statement"
],
"properties": {
"statement": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 4000
}
},
"description": "Paid partnership disclosure. Required before send.",
"additionalProperties": false
},
"visibility": {
"enum": [
"private",
"public"
],
"type": "string",
"description": "Defaults to public, which opens the campaign to anyone signed in once its proposals are sent. Private costs 1 credit and keeps it to the organization after the send. Before the send, only the organization opens it either way."
},
"embargoUntil": {
"type": "string",
"format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$",
"description": "Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. It needs a contract in the same request. Omit when unset."
},
"idempotencyKey": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Client-generated key. A valid repeat with the same key answers with the campaign the first call created, even when its other fields differ."
},
"marketInformation": {
"type": "object",
"required": [
"releaseDelayMonths"
],
"properties": {
"releaseDelayMonths": {
"anyOf": [
{
"type": "integer",
"maximum": 18,
"minimum": 0
},
{
"type": "null"
}
]
}
},
"description": "When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date.",
"additionalProperties": false
}
},
"additionalProperties": false
}| platform |
| string |
| Instagram (ig) or TikTok (tt), in either letter case |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"q",
"creators"
],
"properties": {
"q": {
"type": "string",
"allOf": [
{
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 200,
"description": "Natural-language brief: audience, brand vibe, or campaign goal"
}
],
"description": "Natural-language creator brief"
},
"name": {
"type": "string",
"allOf": [
{
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 100,
"description": "List name. Omit to name the List after the brief in q"
}
],
"description": "Campaign name"
},
"tier": {
"type": "string",
"allOf": [
{
"enum": [
"nano",
"micro",
"mid",
"macro",
"mega",
"nano+",
"micro+",
"mid+",
"macro+",
"micro-",
"mid-",
"macro-"
]
}
],
"description": "Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one."
},
"country": {
"type": "string",
"pattern": "^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$",
"description": "One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca"
},
"creators": {
"type": "array",
"items": {
"type": "object",
"required": [
"fitScore",
"profileId"
],
"properties": {
"fitScore": {
"anyOf": [
{
"type": "number",
"maximum": 1,
"minimum": 0
},
{
"type": "null"
}
],
"description": "Fit score from search_creators, 0 to 1, or null when unknown"
},
"profileId": {
"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|[fF]{8}-[fF]{4}-[fF]{4}-[fF]{4}-[fF]{12})$",
"description": "Creator profile id from search_creators"
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "The creators to keep on the List: the profileId and fitScore of each"
},
"platform": {
"type": "string",
"allOf": [
{
"enum": [
"ig",
"tt"
]
}
],
"description": "Instagram (ig) or TikTok (tt), in either letter case"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"allOf": [
{
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 200,
"description": "Natural-language brief: audience, brand vibe, or campaign goal"
}
],
"description": "Natural-language creator brief"
},
"tier": {
"type": "string",
"allOf": [
{
"enum": [
"nano",
"micro",
"mid",
"macro",
"mega",
"nano+",
"micro+",
"mid+",
"macro+",
"micro-",
"mid-",
"macro-"
]
}
],
"description": "Follower tier: nano 1,000 to 9,999, micro 10,000 to 49,999, mid 50,000 to 249,999, macro 250,000 to 999,999, mega 1,000,000 or more, nano+ 1,000 or more, micro+ 10,000 or more, mid+ 50,000 or more, macro+ 250,000 or more, micro- 1,000 to 49,999, mid- 1,000 to 249,999, macro- 1,000 to 999,999. A plus tier means that follower count and above, and a minus tier means that tier and every smaller one."
},
"country": {
"type": "string",
"pattern": "^(?:\\s*(?:[aA][dD]|[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][qQ]|[aA][rR]|[aA][sS]|[aA][tT]|[aA][uU]|[aA][wW]|[aA][xX]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][dD]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][iI]|[bB][jJ]|[bB][lL]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][qQ]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][vV]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][cC]|[cC][dD]|[cC][fF]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][kK]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][uU]|[cC][vV]|[cC][wW]|[cC][xX]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][jJ]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][hH]|[eE][rR]|[eE][sS]|[eE][tT]|[fF][iI]|[fF][jJ]|[fF][kK]|[fF][mM]|[fF][oO]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][fF]|[gG][gG]|[gG][hH]|[gG][iI]|[gG][lL]|[gG][mM]|[gG][nN]|[gG][pP]|[gG][qQ]|[gG][rR]|[gG][sS]|[gG][tT]|[gG][uU]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][mM]|[hH][nN]|[hH][rR]|[hH][tT]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][mM]|[iI][nN]|[iI][oO]|[iI][qQ]|[iI][rR]|[iI][sS]|[iI][tT]|[jJ][eE]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][iI]|[kK][mM]|[kK][nN]|[kK][pP]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][iI]|[lL][kK]|[lL][rR]|[lL][sS]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][cC]|[mM][dD]|[mM][eE]|[mM][fF]|[mM][gG]|[mM][hH]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][pP]|[mM][qQ]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][cC]|[nN][eE]|[nN][fF]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][uU]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][fF]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][mM]|[pP][nN]|[pP][rR]|[pP][sS]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][eE]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][dD]|[sS][eE]|[sS][gG]|[sS][hH]|[sS][iI]|[sS][jJ]|[sS][kK]|[sS][lL]|[sS][mM]|[sS][nN]|[sS][oO]|[sS][rR]|[sS][sS]|[sS][tT]|[sS][vV]|[sS][xX]|[sS][yY]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][fF]|[tT][gG]|[tT][hH]|[tT][jJ]|[tT][kK]|[tT][lL]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][vV]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][mM]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][aA]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][iI]|[vV][nN]|[vV][uU]|[wW][fF]|[wW][sS]|[xX][kK]|[yY][eE]|[yY][tT]|[zZ][aA]|[zZ][mM]|[zZ][wW])\\s*(?:,(?!\\s*$)|$))+$",
"description": "One or more ISO 3166-1 alpha-2 country codes in either letter case, comma separated, such as us or us,ca"
},
"platform": {
"type": "string",
"allOf": [
{
"enum": [
"ig",
"tt"
]
}
],
"description": "Instagram (ig) or TikTok (tt), in either letter case"
}
},
"additionalProperties": true
}| campaignId* | string | Campaign id from list_campaigns |
| disclosure | object | Paid partnership disclosure. Required before send. |
| visibility | string | Who opens the campaign once its proposals are sent. Public is free. Private costs 1 credit. Before the send, only the organization opens the campaign, whatever the visibility. |
| embargoUntil | any | Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Null clears it. |
| marketInformation | any | When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. Null clears the answer. While a funding request is open or the campaign holds funds, a change or a clear is refused. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"campaignId"
],
"properties": {
"goal": {
"type": "string",
"allOf": [
{
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 200,
"description": "Campaign goal, also the brief for generate_campaign_matches"
}
],
"description": "Campaign goal"
},
"name": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 100,
"description": "Campaign name"
},
"status": {
"enum": [
"active",
"archived",
"draft"
],
"type": "string",
"description": "draft, archived, or active. Starcovery sets active when the team sends the proposals; active reopens an archived campaign whose proposals were sent."
},
"contract": {
"anyOf": [
{
"type": "object",
"required": [
"compensationCents",
"deliverable",
"platforms"
],
"properties": {
"platforms": {
"type": "array",
"items": {
"enum": [
"ig",
"tt"
],
"type": "string"
},
"maxItems": 2,
"minItems": 1,
"description": "Platforms the creator posts on for the one payment: ig for Instagram, tt for TikTok. A creator posts on each one they run."
},
"deliverable": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 2000
},
"compensationCents": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"creatorPostingDate": {
"type": "string",
"format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$",
"description": "Creator posting date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Omit when unset."
}
},
"description": "Compensation in USD cents, the paid deliverable, the platforms the creator posts on, and optional creator posting date.",
"additionalProperties": true
},
{
"type": "null"
}
],
"description": "Null clears stored contract metadata. A stored declassifying date needs a contract, so clear embargoUntil in the same patch."
},
"campaignId": {
"type": "string",
"minLength": 1,
"description": "Campaign id from list_campaigns"
},
"disclosure": {
"type": "object",
"required": [
"statement"
],
"properties": {
"statement": {
"type": "string",
"pattern": "^[^\\u0000]*[^\\u0000-\\u0020\\u007F-\\u00A0\\u00AD\\u0300-\\u036F\\u034F\\u061C\\u115F\\u1160\\u1680\\u17B4\\u17B5\\u180B-\\u180F\\u2000-\\u200F\\u2028-\\u202F\\u205F-\\u206F\\u20D0-\\u20F0\\u2800\\u3000\\u3164\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFEFF\\uFFA0\\uFFF0-\\uFFF8][^\\u0000]*$",
"maxLength": 4000
}
},
"description": "Paid partnership disclosure. Required before send.",
"additionalProperties": true
},
"visibility": {
"enum": [
"private",
"public"
],
"type": "string",
"description": "Who opens the campaign once its proposals are sent. Public is free. Private costs 1 credit. Before the send, only the organization opens the campaign, whatever the visibility."
},
"embargoUntil": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^\\d{4}-\\d{2}-\\d{2}[Tt](?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:[Zz]|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$",
"description": "Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused."
},
{
"type": "null"
}
],
"description": "Campaign details declassifying date as the start of a UTC calendar day, an RFC 3339 date-time at midnight UTC such as 2026-12-01T00:00:00Z. Any other instant is refused. Null clears it."
},
"marketInformation": {
"anyOf": [
{
"type": "object",
"required": [
"releaseDelayMonths"
],
"properties": {
"releaseDelayMonths": {
"anyOf": [
{
"type": "integer",
"maximum": 18,
"minimum": 0
},
{
"type": "null"
}
]
}
},
"additionalProperties": true
},
{
"type": "null"
}
],
"description": "When the campaign's name and pay per creator may join the going rate, the list of campaigns and the typical pay other organizations and creators see, which sets the platform fee: releaseDelayMonths 0 to 18 holds them back that many months after the first funding request since the campaign last held no funds for a fee of that many percent of the creator pool, and a releaseDelayMonths of null keeps them out for a 20 percent fee. A campaign joins no earlier than its declassifying date. Null clears the answer. While a funding request is open or the campaign holds funds, a change or a clear is refused."
}
},
"additionalProperties": true
}