Skip to main content
Glama

Start a Promo campaign

start_campaign

Start a campaign for an upcoming release, or a month between releases (between_releases: true, from tomorrow; none starts by itself, so start the next month the same way when one ends). A release already out gets no campaign of its own: its start is made between releases with its song first (the answer says between_releases: true). Audora writes the campaign (every post's day, time, words and what picture or video it needs) at a price that grows with its size (2 a week is the least, Every day the most; the dry run's quote.plan says it), charged when it starts and returned if the plan fails; starting it needs the artist's spend permission. Nothing is made: fill each post from the artist's Library with update_post, or have Audora make one with make_posts (priced then). A campaign is planned in moments: one video or picture posted the same day on every connected account it fits, with words for each account. Each moment costs 1 credit to go out, all its accounts included, only when it is scheduled. The answers about the song (the_story, key_lyrics, key_moments, what_works, sonic_references, note) are the Start panel's: optional, filled from what Audora knows when left out, and they turn on posts that use them. A release (or the time between releases) can run several campaigns at once, each with its own language, lead market and accounts; one that would copy a live campaign in all three is refused (a dry run's quote.duplicate_of names it, quote.live_campaigns lists them). Planned posts fit around the posts other campaigns already have on the same accounts: one video and one picture a day per account. Use dry_run first to see the posts, the price and those answers (quote.answers), tell the artist, then start with confirm_cost_credits.

Input Schema

NameRequiredDescriptionDefault
noteNoOptional, ≤ 200 characters: "Anything we should know?", anything else the planner should know, in the artist's words. Left out: the last campaign's for this release, if any.
sizeYesHow often: light is 2 moments a week, steady 4 a week, loud every day (a video moment and a picture moment each day, so every account posts every day). A release campaign runs 5 weeks before release day and 2 after (49 days: light 14 moments, steady 28, loud 98), its moments climbing toward release day; between releases a month (30 days: light 9, steady 17, loud 60). A release closer than 5 weeks has fewer days and so fewer moments. The dry run quotes the exact moments and posts.
aboutNoBetween releases only: what the campaign is about. "song" (with about_track_id, one of the artist's songs) or "artist" (posts about who they are, their sound and their artist page; no line is kept). Left out: planned as before.
lanesYesWhere the posts go. Only lanes with a connected account are planned.
artistNoOnly when you are connected as a label: the roster artist this call is for — their artist_user_id from list_roster, or their exact artist name. Required for every artist tool on a label connection. Leave it out on an artist's own connection.
dry_runNoTrue to check the call and see what it would do, without writing anything.
accountsNoOptional, for an artist with more than one account on a platform: which account each platform posts through, as the account's id, @handle or name (a dry run's quote.accounts lists them). Every post of the campaign is tied to its account and never goes out on another. Left out for a platform: the account the newest campaign in this language used there, else the artist's main account.
the_storyNoOptional, ≤ 5000 characters: "The story behind it", in the artist's own words. Where it was written, what happened, who it is for. Posts tell it in your words. Never write it for them.
key_lyricsNoOptional, up to 2: "A line that matters", word for word from the song's lyrics (get_track has them). A line not in the lyrics is refused; a song with no lyrics takes a line the artist types; an instrumental takes none.
release_idNoThe release (from list_releases or list_campaigns' can_start). Or use between_releases.
what_worksNoOptional, ≤ 2000 characters: "What worked before", in the artist's words. A post, a format or a time that did well for you. Posts can take the same shape again.
key_momentsNoOptional, up to 6: "Something coming up". A show, a video, a date that matters. Posts lead up to it. Left out: Scene's public shows and parties inside the campaign's days.
lead_marketNoOptional: where most of the listeners for this campaign are. Every post is timed for that market's clock. null: timed where the artist is. Left out: the last campaign's market, else the first market on the artist's page (a dry run's quote.markets says which).
lyric_videoNoOptional: the campaign's first made video shows the song's words in time with the song. Audora times the lyrics when the campaign starts (free), so that video comes about 10 minutes later. false: no video shows lyrics. Left out: on when the song's lyrics can be timed. A dry run's quote.lyric_video says the song and where its lyrics stand (to_time, timing, timed, or why not: no_lyrics, instrumental, language, no_master).
loop_opt_outNoOptional: what the artist does not want Audora to lean on in this campaign, from a dry run's quote.from_results (Start a campaign's "From your results": the angles, hours and picture sources the artist's own post results say have done best, each line with its count). Pass a line's opt_out entries for each line the artist unticks; that choice is then made as it is for everyone, for this campaign only. Left out: every line is planned with. Each post still gets one try at something new either way. quote.from_results is null when there is no line.
post_languageNoOptional: the language every post in this campaign is written in, with the text on its pictures and videos. Left out: the artist's Post language, else the language the artist's own post results have done best in (when their results are in 2 or more languages and one holds 4 or more and beats their usual most often), else the language the release's songs are sung in, else en-US. A dry run's quote.post_language says which and why; its results names the language their results favor, also when their Post language is another (offer it, never assume it). It is the campaign's, never written back to the artist.
about_track_idNoWith about: "song", the song the campaign is about (list_tracks).
idempotency_keyNoSend the same key if you retry, and the change happens once.
replace_plan_idNoOptional: start that campaign over (an id from list_campaigns, for the same release or between releases). Its posts not yet scheduled are removed once the new campaign is written; scheduled ones stay and go out.
between_releasesNoTrue for a month between releases instead of a release's campaign.
picture_fallbackNoOptional: what fills a post the artist's own photos and cover do not cover, when Audora is asked to make it (make_posts, or in the app). stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Stock and new cost the same (the artist's own photos and cover are free). Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used.
sonic_referencesNoOptional, up to 5 names: "Artists you sound like". Left out: the Artist page's reference artists.
key_lyrics_track_idNoThe song the lines are from: one of the release's songs, or between releases any of the artist's. Left out: the release's songs are tried; between releases, the artist's newest songs with lyrics.
confirm_cost_creditsNoThe price a dry run quoted (charged_at_start: the plan at its size) and you told the artist. Required to start.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / loop_opt_out
      Added value: +{
      +  "description": "Optional: what the artist does not want Audora to lean on in this campaign, from a dry run's quote.from_results (Start a campaign's \"From your results\": the angles, hours and picture sources the artist's own post results say have done best, each line with its count). Pass a line's opt_out entries for each line the artist unticks; that choice is then made as it is for everyone, for this campaign only. Left out: every line is planned with. Each post still gets one try at something new either way. quote.from_results is null when there is no line.",
      +  "items": {
      +    "properties": {
      +      "dimension": {
      +        "enum": [
      +          "angle",
      +          "hour_band",
      +          "picture_source"
      +        ],
      +        "type": "string"
      +      },
      +      "platform": {
      +        "enum": [
      +          "instagram",
      +          "story",
      +          "facebook",
      +          "tiktok",
      +          "youtube"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "dimension",
      +      "platform",
      +      "value"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / post_language / description
      Previous value: -"Optional: the language every post in this campaign is written in, with the text on its pictures and videos. Left out: the artist's Post language, else the language the release's songs are sung in, else en-US. A dry run's quote.post_language says which and why. It is the campaign's, never written back to the artist."New value: +"Optional: the language every post in this campaign is written in, with the text on its pictures and videos. Left out: the artist's Post language, else the language the artist's own post results have done best in (when their results are in 2 or more languages and one holds 4 or more and beats their usual most often), else the language the release's songs are sung in, else en-US. A dry run's quote.post_language says which and why; its results names the language their results favor, also when their Post language is another (offer it, never assume it). It is the campaign's, never written back to the artist."
  2. Changed3 schema fields changed
    • addedInput schema / properties / accounts
      Added value: +{
      +  "description": "Optional, for an artist with more than one account on a platform: which account each platform posts through, as the account's id, @handle or name (a dry run's quote.accounts lists them). Every post of the campaign is tied to its account and never goes out on another. Left out for a platform: the account the newest campaign in this language used there, else the artist's main account.",
      +  "properties": {
      +    "facebook": {
      +      "type": "string"
      +    },
      +    "instagram": {
      +      "type": "string"
      +    },
      +    "tiktok": {
      +      "type": "string"
      +    },
      +    "youtube": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / lead_market
      Added value: +{
      +  "description": "Optional: where most of the listeners for this campaign are. Every post is timed for that market's clock. null: timed where the artist is. Left out: the last campaign's market, else the first market on the artist's page (a dry run's quote.markets says which).",
      +  "enum": [
      +    "us",
      +    "uk",
      +    "eu",
      +    "nordics",
      +    "dach",
      +    "france",
      +    "latam",
      +    "japan",
      +    "kpop",
      +    "china",
      +    "india",
      +    "mena",
      +    "africa",
      +    "anz",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedInput schema / properties / replace_plan_id
      Added value: +{
      +  "description": "Optional: start that campaign over (an id from list_campaigns, for the same release or between releases). Its posts not yet scheduled are removed once the new campaign is written; scheduled ones stay and go out.",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • changedInput schema / properties / post_language / enum
      Previous value: -[
      -  "en-US",
      -  "en-GB",
      -  "sv",
      -  "nb",
      -  "da",
      -  "fi",
      -  "is",
      -  "de",
      -  "nl",
      -  "fr",
      -  "es-ES",
      -  "es-419",
      -  "pt-BR",
      -  "pt-PT",
      -  "it"
      -]New value: +[
      +  "en-US",
      +  "en-GB",
      +  "sv",
      +  "nb",
      +  "da",
      +  "fi",
      +  "is",
      +  "de",
      +  "nl",
      +  "fr",
      +  "es-ES",
      +  "es-419",
      +  "pt-BR",
      +  "pt-PT",
      +  "it",
      +  "zh-CN",
      +  "zh-TW",
      +  "ja",
      +  "ko"
      +]
  4. Changed6 schema fields changed
    • changedInput schema / properties / between_releases / description
      Previous value: -"True for a new always-on campaign between releases instead of a release's."New value: +"True for a month between releases instead of a release's campaign."
    • changedInput schema / properties / confirm_cost_credits / description
      Previous value: -"The price a dry run quoted (charged_at_start) and you told the artist. Required with make, or when the plan itself has a price."New value: +"The price a dry run quoted (charged_at_start: the plan at its size) and you told the artist. Required to start."
    • changedInput schema / properties / lyric_video / description
      Previous value: -"Optional, with make: the campaign's first video shows the song's words in time with the song. Audora times the lyrics when the campaign starts (free), so that video comes about 10 minutes later. false: no video shows lyrics. Left out: on when the song's lyrics can be timed. A dry run's quote.lyric_video says the song and where its lyrics stand (to_time, timing, timed, or why not: no_lyrics, instrumental, language, no_master)."New value: +"Optional: the campaign's first made video shows the song's words in time with the song. Audora times the lyrics when the campaign starts (free), so that video comes about 10 minutes later. false: no video shows lyrics. Left out: on when the song's lyrics can be timed. A dry run's quote.lyric_video says the song and where its lyrics stand (to_time, timing, timed, or why not: no_lyrics, instrumental, language, no_master)."
    • removedInput schema / properties / make
      Removed value: -{
      -  "description": "Have Audora fill every post's picture or video too: from the artist's Library first (their photos and cover as cards, and their own videos posted as they are, free to make), then made (credits; needs the artist's spend permission). Default: plan only.",
      -  "type": "boolean"
      -}
    • changedInput schema / properties / picture_fallback / description
      Previous value: -"Optional: what fills the posts the artist's own photos and cover do not cover, when Audora makes them. stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Stock and new cost the same (the artist's own photos and cover are free). Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used."New value: +"Optional: what fills a post the artist's own photos and cover do not cover, when Audora is asked to make it (make_posts, or in the app). stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Stock and new cost the same (the artist's own photos and cover are free). Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used."
    • changedInput schema / properties / size / description
      Previous value: -"light (4 moments), steady (12) or loud (18). A release campaign runs 5 weeks before release day and 2 after, its moments climbing toward release day; between releases that many every month, its first stretch to the next credit arrival getting its share."New value: +"How often: light is 2 moments a week, steady 4 a week, loud every day (a video moment and a picture moment each day, so every account posts every day). A release campaign runs 5 weeks before release day and 2 after (49 days: light 14 moments, steady 28, loud 98), its moments climbing toward release day; between releases a month (30 days: light 9, steady 17, loud 60). A release closer than 5 weeks has fewer days and so fewer moments. The dry run quotes the exact moments and posts."
  5. Changed5 schema fields changed
    • changedInput schema / properties / between_releases / description
      Previous value: -"True for the posts between releases instead of a release."New value: +"True for a new always-on campaign between releases instead of a release's."
    • changedInput schema / properties / key_moments / description
      Previous value: -"Optional, up to 6: \"Something coming up\". A show, a video, a date that matters. Posts lead up to it. Left out: Scene's public shows and parties inside the campaign's weeks."New value: +"Optional, up to 6: \"Something coming up\". A show, a video, a date that matters. Posts lead up to it. Left out: Scene's public shows and parties inside the campaign's days."
    • changedInput schema / properties / make / description
      Previous value: -"Have Audora make every post's picture or video too (credits; needs the artist's spend permission). Default: plan only."New value: +"Have Audora fill every post's picture or video too: from the artist's Library first (their photos and cover as cards, and their own videos posted as they are, free to make), then made (credits; needs the artist's spend permission). Default: plan only."
    • changedInput schema / properties / picture_fallback / description
      Previous value: -"Optional: what fills the posts the artist's own photos and cover do not cover, when Audora makes them. stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Same price whichever. Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used."New value: +"Optional: what fills the posts the artist's own photos and cover do not cover, when Audora makes them. stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Stock and new cost the same (the artist's own photos and cover are free). Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used."
    • changedInput schema / properties / size / description
      Previous value: -"light, steady or loud: how many posts over how many weeks."New value: +"light (4 moments), steady (12) or loud (18). A release campaign runs 5 weeks before release day and 2 after, its moments climbing toward release day; between releases that many every month, its first stretch to the next credit arrival getting its share."
  6. Changed1 schema field changed
    • addedInput schema / properties / lyric_video
      Added value: +{
      +  "description": "Optional, with make: the campaign's first video shows the song's words in time with the song. Audora times the lyrics when the campaign starts (free), so that video comes about 10 minutes later. false: no video shows lyrics. Left out: on when the song's lyrics can be timed. A dry run's quote.lyric_video says the song and where its lyrics stand (to_time, timing, timed, or why not: no_lyrics, instrumental, language, no_master).",
      +  "type": "boolean"
      +}
  7. Changed3 schema fields changed
    • addedInput schema / properties / about
      Added value: +{
      +  "description": "Between releases only: what the campaign is about. \"song\" (with about_track_id, one of the artist's songs) or \"artist\" (posts about who they are, their sound and their artist page; no line is kept). Left out: planned as before.",
      +  "enum": [
      +    "song",
      +    "artist"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / about_track_id
      Added value: +{
      +  "description": "With about: \"song\", the song the campaign is about (list_tracks).",
      +  "type": "string"
      +}
    • addedInput schema / properties / picture_fallback
      Added value: +{
      +  "description": "Optional: what fills the posts the artist's own photos and cover do not cover, when Audora makes them. stock: free Pixabay stock photos, always made into the artist's cards (people and brands left out; not offered for a song about drugs, sex or politics). new: Audora draws a new picture. ask: those posts wait for the artist to pick a photo in the app. Same price whichever. Left out: the artist's last answer, else stock. A dry run's quote.picture_fallback says the starting choice and whether stock may be used.",
      +  "enum": [
      +    "stock",
      +    "new",
      +    "ask"
      +  ],
      +  "type": "string"
      +}
  8. Changed7 schema fields changed
    • addedInput schema / properties / key_lyrics
      Added value: +{
      +  "description": "Optional, up to 2: \"A line that matters\", word for word from the song's lyrics (get_track has them). A line not in the lyrics is refused; a song with no lyrics takes a line the artist types; an instrumental takes none.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / key_lyrics_track_id
      Added value: +{
      +  "description": "The song the lines are from: one of the release's songs, or between releases any of the artist's. Left out: the release's songs are tried; between releases, the artist's newest songs with lyrics.",
      +  "type": "string"
      +}
    • addedInput schema / properties / key_moments
      Added value: +{
      +  "description": "Optional, up to 6: \"Something coming up\". A show, a video, a date that matters. Posts lead up to it. Left out: Scene's public shows and parties inside the campaign's weeks.",
      +  "items": {
      +    "properties": {
      +      "date": {
      +        "description": "YYYY-MM-DD, still ahead.",
      +        "type": "string"
      +      },
      +      "event_id": {
      +        "description": "A Scene event's id (list_events): its own date, place and link are used.",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "description": "show, a party, or other.",
      +        "enum": [
      +          "show",
      +          "release_party",
      +          "listening_party",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "label": {
      +        "description": "What happens, in the artist's words.",
      +        "type": "string"
      +      },
      +      "link_url": {
      +        "description": "Optional https link for tickets or info.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "date",
      +      "label"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedInput schema / properties / note / description
      Previous value: -"Optional, ≤ 200 characters: anything the planner should know (a show, the story behind the song), in the artist's words."New value: +"Optional, ≤ 200 characters: \"Anything we should know?\", anything else the planner should know, in the artist's words. Left out: the last campaign's for this release, if any."
    • addedInput schema / properties / sonic_references
      Added value: +{
      +  "description": "Optional, up to 5 names: \"Artists you sound like\". Left out: the Artist page's reference artists.",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedInput schema / properties / the_story
      Added value: +{
      +  "description": "Optional, ≤ 5000 characters: \"The story behind it\", in the artist's own words. Where it was written, what happened, who it is for. Posts tell it in your words. Never write it for them.",
      +  "type": "string"
      +}
    • addedInput schema / properties / what_works
      Added value: +{
      +  "description": "Optional, ≤ 2000 characters: \"What worked before\", in the artist's words. A post, a format or a time that did well for you. Posts can take the same shape again.",
      +  "type": "string"
      +}
  9. Changed1 schema field changed
    • addedInput schema / properties / post_language
      Added value: +{
      +  "description": "Optional: the language every post in this campaign is written in, with the text on its pictures and videos. Left out: the artist's Post language, else the language the release's songs are sung in, else en-US. A dry run's quote.post_language says which and why. It is the campaign's, never written back to the artist.",
      +  "enum": [
      +    "en-US",
      +    "en-GB",
      +    "sv",
      +    "nb",
      +    "da",
      +    "fi",
      +    "is",
      +    "de",
      +    "nl",
      +    "fr",
      +    "es-ES",
      +    "es-419",
      +    "pt-BR",
      +    "pt-PT",
      +    "it"
      +  ],
      +  "type": "string"
      +}
  10. First observed

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it is a non-destructive, non-idempotent write; the description adds substantial context beyond that: credits are charged when it starts and returned if the plan fails, the artist's spend permission is required, campaigns that duplicate a live campaign in language/lead market/accounts are refused, and posts are fit around existing scheduled posts (one video and one picture a day per account). It never states what the successful (non-dry-run) response contains, which keeps it off a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the body is a dense stream of parenthetical asides that pack several unrelated rules per sentence ('...the dry run's quote.plan says it), charged when it starts and returned if the plan fails; starting it needs the artist's spend permission'). Rules about between-releases months appear in the first sentence and are restated later, and the dry-run-first instruction — the most actionable line — is buried at the very end.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter mutation tool with no output schema, the description covers most of what an agent needs: cost model, refunds, permission gating, duplicate refusal, scheduling interplay, credit pricing per moment, and dry-run quote semantics. The remaining gap is the shape of the live response (campaign id, resulting schedule), which is never described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds meaning on top by explaining that the answer fields (the_story, key_lyrics, key_moments, what_works, sonic_references, note) are the Start panel's, are optional, are filled from what Audora knows when omitted, and 'turn on posts that use them.' It also points at dry-run quote fields (quote.plan, quote.duplicate_of, quote.markets, quote.post_language) that explain defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Start a campaign') and immediately splits the two modes (an upcoming release, or a month between releases). It also carves out the exclusion case ('a release already out gets no campaign of its own'), so an agent can distinguish this from siblings like update_post, make_posts and list_campaigns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It spells out the operating sequence explicitly: 'Use dry_run first to see the posts, the price and those answers, tell the artist, then start with confirm_cost_credits.' It also names when to reach for alternatives — 'Nothing is made: fill each post from the artist's Library with update_post, or have Audora make one with make_posts' — and when to use replace_plan_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources