---
title: "Create a paused flexible (dynamic creative) Meta ad"
method: POST
path: "/api/v1/tools/meta_create_flexible_ad/execute"
tags: ["Meta Ads"]
---

# Create a paused flexible (dynamic creative) Meta ad

`POST /api/v1/tools/meta_create_flexible_ad/execute`

## Request

- Base URL: `https://adako.ai`
- URL: `https://adako.ai/api/v1/tools/meta_create_flexible_ad/execute`
- Auth: HTTP bearer

Creates one ad that carries several primary texts, headlines, descriptions and images; Meta assembles the combinations and learns which one works per person. The ad is created PAUSED inside an ad set that already exists.
Use when: the user wants to test creative variants inside one audience, and the ad set is already set up. Get the ad set id from meta_list_ad_sets.
Do not use to create a campaign — meta_create_image_campaign, meta_create_video_campaign and meta_create_carousel_campaign do that. Do not use it to run a clean A/B test where each variant needs its own reporting: Meta reports the ad, not the combination, so per-variant numbers are limited.
Do not pad the lists with near-identical wording. Fewer, genuinely different assets learn faster.
Returns the new ad and creative ids, the uploaded image hashes and how many combinations Meta can build.
If the user has not said which ad set, ask — this tool never creates one.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `arguments` object, required
    - `ad_account_id` string: Meta ad account id such as act_1234567890. Omit it to use the primary account; if several accounts are active and none is primary the call fails and lists the valid ids.
    - `ad_set_id` string, required: The existing ad set the flexible ad goes into, from meta_list_ad_sets.
    - `ad_name` string, required: Name for the new ad, shown in Ads Manager.
    - `primary_texts` string[], required: Up to 5 genuinely different versions of the main copy. Meta picks per person; near-duplicates waste the test.
    - `headlines` string[], required: Up to 5 headlines. About 40 characters show.
    - `descriptions` string[]: Optional description lines, shown on some placements only.
    - `image_urls` string[], required: Up to 10 images for Meta to combine with the texts. Adako hosts no files: the platform downloads this URL itself, from its own servers and often hours later, so it must be a public link straight to the file — not a file on the computer, not a Drive, Dropbox or design-tool share page, not a link that expires or asks for a login. Call check_media first: it repairs the usual share links, checks the file against this platform, and says where to put a file that has no link yet.
    - `landing_page_url` string, uri, required: Where every combination sends people.
    - `call_to_action` 'LEARN_MORE' | 'SHOP_NOW' | 'SIGN_UP' | 'SUBSCRIBE' | 'DOWNLOAD' | 'BOOK_NOW' | 'GET_QUOTE' | 'CONTACT_US' | 'APPLY_NOW' | 'GET_OFFER' | 'ORDER_NOW' | 'SEE_MORE' | 'GET_STARTED' | 'BUY_NOW' | 'DONATE_NOW' | 'NO_BUTTON': Button label used by every combination. Defaults to LEARN_MORE.
    - `url_tags` string: Tracking parameters appended to the destination, e.g. utm_source=facebook&utm_medium=paid.
    - `facebook_page_id` string: Page the ad runs from, from meta_list_pages.
    - `instagram_account_id` string: Instagram account to run the ad from.
    - `idempotency_key` string: Optional caller-supplied key; identical keys never execute twice.
    - `raw_data` boolean: Return compact JSON only (no markdown). Use when you will compute on the result.

## Response `200`

The tool ran. A write returns proposal_id and approve_url while the change waits for approval.

- SuccessEnvelope
  - `success` unknown, required
  - `tool` string, required
  - `data` object, required: Machine-readable result.
  - `markdown` string, required: The same result written for a person or a model.
  - `quota` Quota: Task usage for the current billing period.
    - `plan` string
    - `used` integer
    - `limit` integer
    - `period_end` string
    - `upgrade_url` string
  - `proposal_id` string: Present for writes. Nothing changes on the ad platform until it is approved.
  - `approve_url` string: Where a person approves the proposal.
  - `request_id` string, required

## Other responses

- `400`: Invalid arguments, or the ad account could not be resolved.
- `401`: Missing, invalid, revoked or expired API key.
- `402`: Monthly task quota used up, or the plan does not include this tool.
- `403`: The connected ad account lacks the access level this tool needs.
- `404`: Unknown tool name.
- `409`: Not connected, reconnect needed, confirmation required, a proposal already pending or no longer pending, an identical create that failed earlier today (proposal_failed_before), a create that duplicates an approved one (duplicate_create), the ad-account limit of the plan reached (account_limit), or an Idempotency-Key reused with different arguments.
- `429`: Rate limited by Adako or by the ad platform. See Retry-After.
- `500`: Unexpected error inside Adako.
- `502`: The ad platform returned an error.

---

[API](https://skmtc.dev/adako/apis/adako-rest-api.md) · [All operations](https://skmtc.dev/adako/apis/adako-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/adako/apis/adako-rest-api/revisions/59ee60d48a56?raw)
