Ad copy.

Send a product and an audience, get back Meta-ready ad copy and a bank of hooks. Every variant maps field for field onto POST /meta/creatives, so you can generate and publish without reshaping anything.

Generate ad copy

POST/api/v1/generate/ad-copy

Body

productstring, requiredWhat you are selling. 2 to 500 characters.
audiencestring, requiredWho the ad is for. The more specific, the better the copy.
offerstringDiscount, trial, bundle, free shipping.
pain_pointsstring[]Up to 10. The copy leans on these.
benefitsstring[]Up to 10.
tonestringVoice, e.g. playful, clinical, founder-led.
objectivestringe.g. sales, leads, app installs. Steers the call to action.
landing_urlstringDestination page, used as context.
languagestringDefaults to English.
num_variantsint1 to 10. Default 3. Each variant takes a different angle.
num_hooksint0 to 20. Default 10.

Request

curl -X POST https://api.brandmov.com/api/v1/generate/ad-copy \
  -H "Authorization: Bearer bm_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "product": "Magnesium glycinate sleep gummies",
    "audience": "Women 30-50 who wake up at 3am and cannot fall back asleep",
    "offer": "20% off first order",
    "pain_points": ["groggy mornings", "melatonin hangover"],
    "tone": "warm, no hype",
    "objective": "sales",
    "num_variants": 3,
    "num_hooks": 4
  }'

Response: 200 OK

{
  "variants": [
    {
      "id": "v1",
      "angle": "melatonin-free mornings",
      "hook": "Wake up without the melatonin hangover",
      "primary_text": "Wake up without the melatonin hangover. Magnesium glycinate gummies help you drift back after a 3am wake, so mornings feel clear. 20% off your first order.",
      "headline": "Wake rested, every morning",
      "description": "Clear mornings ahead",
      "call_to_action_type": "GET_OFFER"
    }
  ],
  "hooks": [
    {
      "category": "how-to",
      "category_label": "How-To",
      "text": "How to ease back to sleep after 3am"
    }
  ],
  "credits_charged": 10
}

Response fields

  • primary_text: the body copy. It opens with the hook, and the first 125 characters stand on their own because that is where Meta folds the text in feed.
  • headline: up to 40 characters. description: up to 30.
  • call_to_action_type: one of LEARN_MORE, SHOP_NOW, SIGN_UP, GET_OFFER, ORDER_NOW, BOOK_TRAVEL, CONTACT_US, DOWNLOAD, SUBSCRIBE, GET_QUOTE, APPLY_NOW, WATCH_MORE. Always a valid Meta value.
  • hooks[].category: fear-loss, curiosity, social-proof, contrarian, how-to, trend-jacking or identity.

The generator never invents customer counts, ratings, reviews or statistics. If you want social proof in the copy, put the real number in benefits.

Credits

Each call costs 10 credits from your monthly pool, charged only when the generation succeeds. A failed generation returns 502 and costs nothing. When the pool is empty you get 402:

{
  "detail": {
    "error": "credits_exhausted",
    "credits_used": 1000,
    "credits_limit": 1000,
    "credits_required": 10,
    "message": "You've used 1000/1000 credits this period. ..."
  }
}