Launch a paused Meta campaign
Creates, in the company’s selected Meta ad account, a Traffic campaign with one ad set and one ad per entry in ads, all paused, so nothing spends until the merchant switches it on in Ads Manager. Every line of copy first passes a claims check (health, income, testimonial and body-image rules); a critical or high finding refuses the launch with no Meta call. The landing URL gets utm_source=facebook, utm_medium=paid_social and utm_campaign. Requires a company admin with company_settings.update.
curl --request POST \
--url https://api.fluid.app/api/v202506/company/ads/meta/launches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Fall mug launch",
"daily_budget": 2000,
"countries": [
"US"
],
"age_min": 18,
"link_url": "https://shop.example.com/products/fall-mug",
"utm_campaign": "fall-mug-launch",
"ads": [
{
"primary_text": "Our fall mug keeps coffee hot through your morning.",
"headline": "The fall mug is back",
"description": "Free shipping over $50",
"call_to_action": "SHOP_NOW",
"image_url": "https://cdn.example.com/fall-mug-1x1.jpg"
}
]
}
'import requests
url = "https://api.fluid.app/api/v202506/company/ads/meta/launches"
payload = {
"name": "Fall mug launch",
"daily_budget": 2000,
"countries": ["US"],
"age_min": 18,
"link_url": "https://shop.example.com/products/fall-mug",
"utm_campaign": "fall-mug-launch",
"ads": [
{
"primary_text": "Our fall mug keeps coffee hot through your morning.",
"headline": "The fall mug is back",
"description": "Free shipping over $50",
"call_to_action": "SHOP_NOW",
"image_url": "https://cdn.example.com/fall-mug-1x1.jpg"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Fall mug launch',
daily_budget: 2000,
countries: ['US'],
age_min: 18,
link_url: 'https://shop.example.com/products/fall-mug',
utm_campaign: 'fall-mug-launch',
ads: [
{
primary_text: 'Our fall mug keeps coffee hot through your morning.',
headline: 'The fall mug is back',
description: 'Free shipping over $50',
call_to_action: 'SHOP_NOW',
image_url: 'https://cdn.example.com/fall-mug-1x1.jpg'
}
]
})
};
fetch('https://api.fluid.app/api/v202506/company/ads/meta/launches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202506/company/ads/meta/launches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Fall mug launch',
'daily_budget' => 2000,
'countries' => [
'US'
],
'age_min' => 18,
'link_url' => 'https://shop.example.com/products/fall-mug',
'utm_campaign' => 'fall-mug-launch',
'ads' => [
[
'primary_text' => 'Our fall mug keeps coffee hot through your morning.',
'headline' => 'The fall mug is back',
'description' => 'Free shipping over $50',
'call_to_action' => 'SHOP_NOW',
'image_url' => 'https://cdn.example.com/fall-mug-1x1.jpg'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202506/company/ads/meta/launches"
payload := strings.NewReader("{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/v202506/company/ads/meta/launches")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202506/company/ads/meta/launches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"launch": {
"id": "01923f4a-7c2e-7b91-a5d3-6e8f0b4c2a19",
"provider": "meta",
"status": "paused",
"name": "Fall mug launch",
"utm_campaign": "fall-mug-launch",
"platform_campaign_id": "120210000000000001",
"platform_ad_set_id": "120210000000000002",
"platform_ad_ids": [
"120210000000000003"
],
"platform_creative_ids": [
"120210000000000004"
],
"created_at": "2026-10-22T17:05:00Z",
"claims_check": {
"summary": "No policy issues found.",
"violations": [],
"blocking": false
},
"failure": null,
"manage_url": "https://adsmanager.facebook.com/adsmanager/manage/campaigns?act=1029384756&selected_campaign_ids=120210000000000001"
},
"status": 201,
"meta": {
"request_id": "9c2e4f1a-6b3d-4a8e-b5c7-1d0f3e2a9b84",
"timestamp": "2026-10-22T17:05:00Z"
}
}{
"message": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
The campaign name in Ads Manager.
Daily budget in the ad account's minor currency units (cents for USD).
x >= 100ISO 3166-1 alpha-2 country codes to target.
1^[A-Z]{2}$The https landing page; Fluid adds the UTM tags.
The campaign name in Fluid's campaigns report.
^[a-z0-9][a-z0-9_-]*$1 - 5 elementsShow child attributes
Show child attributes
Minimum age to target; defaults to 18.
18 <= x <= 65Optional. A key the caller picks for this launch, such as a hash of the approved pack. Sending the same key again returns the first launch with this key instead of creating another campaign.
100Response
Created. The campaign, ad set and ads exist on Meta, all paused. With an idempotency_key already used, the first launch with that key is returned and nothing new is created.
curl --request POST \
--url https://api.fluid.app/api/v202506/company/ads/meta/launches \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Fall mug launch",
"daily_budget": 2000,
"countries": [
"US"
],
"age_min": 18,
"link_url": "https://shop.example.com/products/fall-mug",
"utm_campaign": "fall-mug-launch",
"ads": [
{
"primary_text": "Our fall mug keeps coffee hot through your morning.",
"headline": "The fall mug is back",
"description": "Free shipping over $50",
"call_to_action": "SHOP_NOW",
"image_url": "https://cdn.example.com/fall-mug-1x1.jpg"
}
]
}
'import requests
url = "https://api.fluid.app/api/v202506/company/ads/meta/launches"
payload = {
"name": "Fall mug launch",
"daily_budget": 2000,
"countries": ["US"],
"age_min": 18,
"link_url": "https://shop.example.com/products/fall-mug",
"utm_campaign": "fall-mug-launch",
"ads": [
{
"primary_text": "Our fall mug keeps coffee hot through your morning.",
"headline": "The fall mug is back",
"description": "Free shipping over $50",
"call_to_action": "SHOP_NOW",
"image_url": "https://cdn.example.com/fall-mug-1x1.jpg"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Fall mug launch',
daily_budget: 2000,
countries: ['US'],
age_min: 18,
link_url: 'https://shop.example.com/products/fall-mug',
utm_campaign: 'fall-mug-launch',
ads: [
{
primary_text: 'Our fall mug keeps coffee hot through your morning.',
headline: 'The fall mug is back',
description: 'Free shipping over $50',
call_to_action: 'SHOP_NOW',
image_url: 'https://cdn.example.com/fall-mug-1x1.jpg'
}
]
})
};
fetch('https://api.fluid.app/api/v202506/company/ads/meta/launches', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.fluid.app/api/v202506/company/ads/meta/launches",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Fall mug launch',
'daily_budget' => 2000,
'countries' => [
'US'
],
'age_min' => 18,
'link_url' => 'https://shop.example.com/products/fall-mug',
'utm_campaign' => 'fall-mug-launch',
'ads' => [
[
'primary_text' => 'Our fall mug keeps coffee hot through your morning.',
'headline' => 'The fall mug is back',
'description' => 'Free shipping over $50',
'call_to_action' => 'SHOP_NOW',
'image_url' => 'https://cdn.example.com/fall-mug-1x1.jpg'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.fluid.app/api/v202506/company/ads/meta/launches"
payload := strings.NewReader("{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.fluid.app/api/v202506/company/ads/meta/launches")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.fluid.app/api/v202506/company/ads/meta/launches")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Fall mug launch\",\n \"daily_budget\": 2000,\n \"countries\": [\n \"US\"\n ],\n \"age_min\": 18,\n \"link_url\": \"https://shop.example.com/products/fall-mug\",\n \"utm_campaign\": \"fall-mug-launch\",\n \"ads\": [\n {\n \"primary_text\": \"Our fall mug keeps coffee hot through your morning.\",\n \"headline\": \"The fall mug is back\",\n \"description\": \"Free shipping over $50\",\n \"call_to_action\": \"SHOP_NOW\",\n \"image_url\": \"https://cdn.example.com/fall-mug-1x1.jpg\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"launch": {
"id": "01923f4a-7c2e-7b91-a5d3-6e8f0b4c2a19",
"provider": "meta",
"status": "paused",
"name": "Fall mug launch",
"utm_campaign": "fall-mug-launch",
"platform_campaign_id": "120210000000000001",
"platform_ad_set_id": "120210000000000002",
"platform_ad_ids": [
"120210000000000003"
],
"platform_creative_ids": [
"120210000000000004"
],
"created_at": "2026-10-22T17:05:00Z",
"claims_check": {
"summary": "No policy issues found.",
"violations": [],
"blocking": false
},
"failure": null,
"manage_url": "https://adsmanager.facebook.com/adsmanager/manage/campaigns?act=1029384756&selected_campaign_ids=120210000000000001"
},
"status": 201,
"meta": {
"request_id": "9c2e4f1a-6b3d-4a8e-b5c7-1d0f3e2a9b84",
"timestamp": "2026-10-22T17:05:00Z"
}
}{
"message": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}{
"message": "<string>",
"error": "<string>",
"error_message": "<string>",
"errors": "<string>",
"meta": {
"request_id": "<string>",
"timestamp": "2023-11-07T05:31:56Z",
"pagination": {
"cursor": "<string>",
"limit": 123,
"prev_cursor": "<string>",
"next_cursor": "<string>",
"total_count": 123
}
}
}