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-copyBody
product | string, required | What you are selling. 2 to 500 characters. |
audience | string, required | Who the ad is for. The more specific, the better the copy. |
offer | string | Discount, trial, bundle, free shipping. |
pain_points | string[] | Up to 10. The copy leans on these. |
benefits | string[] | Up to 10. |
tone | string | Voice, e.g. playful, clinical, founder-led. |
objective | string | e.g. sales, leads, app installs. Steers the call to action. |
landing_url | string | Destination page, used as context. |
language | string | Defaults to English. |
num_variants | int | 1 to 10. Default 3. Each variant takes a different angle. |
num_hooks | int | 0 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 ofLEARN_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-jackingoridentity.
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. ..."
}
}