AdManage.ai logo
Pricing
Blog
API Overview
Platform Docs

Admanage API Reference

#

The Admanage API lets you programmatically launch ads, manage campaigns, duplicate ad sets, query performance data, and organize your creative library. All endpoints use a REST interface over HTTPS.

Base URL

https://api.admanage.ai

Available APIs

SectionDescriptionEndpoints
Meta groups launch, management, comments, conversions, and Meta-specific reporting shortcuts in one place.29
TikTok keeps launch docs here and uses the shared reporting endpoints called out in the reporting panel.1
Snapchat groups launch plus the dedicated campaign, ad squad, and ad management APIs in a single section.6
Pinterest keeps launch docs here and maps reporting to the shared query and spend APIs in the reporting panel.1
Google Ads has its own dedicated manage and reporting surface rather than using the shared reports API.12
LinkedIn groups launch, account discovery, organization posts, duplication, and LinkedIn-specific entity metrics.6
Axon/AppLovin groups launch and campaign duplication here, with reporting limitations called out separately.2
AdScan procedures are exposed through an AdManage compatibility wrapper, so boards, saved ads, Brand Spy, notifications, and other AdScan flows can be called with the same AdManage API key.5
Cross-platform reporting, creative workflow, accounts, automation, and supporting utilities.62

Reporting Coverage By Channel

#

Reporting is channel-specific. Some platforms use the shared reporting endpoints, some have their own Google Ads surface, and some are still only available inside the dashboard manage flow. Use this matrix before deciding which endpoint to call.

ChannelCoverageDashboard SurfacePublic Reporting EndpointsNotes
Public API
/manage/reports
/v1/manage/create-campaign/v1/manage/create-adset/v1/reports/query/v1/reports/meta/reach-composition/v1/analytics/top-ads/v1/spend/daily
Most complete public coverage. Meta supports launch, create-from-scratch campaign/ad set provisioning, reporting tables, reach composition, and top-ad discovery.
Partial Public API
/manage/reports
/v1/reports/query/v1/analytics/top-ads/v1/spend/daily
Shared reporting covers TikTok campaign, ad set, ad, and top-ad questions, but TikTok does not share Meta's reach-composition endpoint.
Partial Public API
/manage
/v1/manage/snapchat/campaigns/v1/manage/snapchat/adsquads/v1/manage/snapchat/ads/v1/spend/daily
Snapchat now has documented manage endpoints for campaigns, ad squads, and ads, plus cross-account daily spend. Use the manage endpoints for entity-level reads.
Partial Public API
/manage/reports
/v1/reports/query/v1/spend/daily
Pinterest performance tables use the shared Query Reports endpoint. There is no dedicated Pinterest top-ads public endpoint in v1 yet.
Partial Public API
/googleAds
/v1/google-ads/campaigns
Google Ads reporting is channel-specific. Use the Google Ads endpoints instead of the shared Query Reports endpoint.
Partial Public API
/manage/launch
/v1/linkedin/manage
LinkedIn now has a documented launch surface plus a LinkedIn-specific manage endpoint for campaign groups, campaigns, creatives, and optional metrics.
Dashboard Only
/launch
None documented in public v1Axon/AppLovin has a public launch path and campaign duplication surface, but reporting is not documented as a public v1 API yet.

Authentication

#

All Admanage API endpoints require an API key. Pass it as a Bearer token in the Authorization header:

Authorization: Bearer YOUR_API_KEY
Sign in to create and manage API keys. | LLM spec (llms.txt)

Rate Limits

#

API requests are rate-limited per API key using a sliding window. Separate budgets apply to read and write operations.

OperationMethodsLimitWindow
ReadGET60 requests60 seconds
WritePOST PATCH DELETE10 requests60 seconds

When you exceed a limit, the API returns 429 Too Many Requests. Use the response headers to track your usage:

X-RateLimit-Limit: 60        # max requests in window
X-RateLimit-Remaining: 42   # requests left
Retry-After: 17             # seconds until budget resets (only on 429)

AI Integration Guide

#

Connect AI assistants like Claude, ChatGPT, or Gemini to the Admanage API to automate ad analysis, launch workflows, and performance reporting. Any AI that supports HTTP tool calls can use these endpoints.

Quick Start

1

Generate an API key

Go to admanage.ai/connect to create a new API key. Copy it to your clipboard.

2

Get your ad accounts

GET /v1/adaccounts returns your ad account IDs and workspace IDs.

3

Get your pages & Instagram profiles

GET /v1/profiles?businessId=act_123 returns Facebook Page IDs (use as page) and Instagram IDs (use as insta) for launching.

4

Get your ad sets

GET /v1/adsets?accountId=act_123 returns ad sets with value and label fields ready to pass directly into your launch request.

5

Launch!

POST /v1/launch with your ad account, page, insta, ad sets, and media URLs. Poll GET /v1/batch-status/:id to track progress.

Claude (Anthropic) — Tool Use

Define Admanage endpoints as tools in your Claude API call. Claude will call them automatically when answering questions about your ads.

JavaScript (Anthropic SDK)
// Example: Give Claude access to batch status + reports
const response = await anthropic.messages.create({
  model: "claude-sonnet-4-20250514",
  max_tokens: 1024,
  tools: [
    {
      name: "get_batch_status",
      description: "Check the status and results of an Admanage ad batch",
      input_schema: {
        type: "object",
        properties: {
          batch_id: {
            type: "string",
            description: "The batch ID to check"
          }
        },
        required: ["batch_id"]
      }
    },
    {
      name: "query_ad_reports",
      description: "Query ad performance metrics from Admanage",
      input_schema: {
        type: "object",
        properties: {
          account_id: {
            type: "string",
            description: "The ad account ID (e.g. act_123456789)"
          },
          date_from: { type: "string", description: "Start date (YYYY-MM-DD)" },
          date_to: { type: "string", description: "End date (YYYY-MM-DD)" }
        },
        required: ["account_id"]
      }
    }
  ],
  messages: [
    { role: "user", content: "How did my ads perform last week?" }
  ]
});

// When Claude calls a tool, execute the API request:
// GET https://api.admanage.ai/v1/batch-status/{batch_id}
// GET https://api.admanage.ai/v1/reports/query?accountId=...&dateFrom=...&dateTo=...
// Headers: { "Authorization": "Bearer YOUR_API_KEY" }

ChatGPT / OpenAI — Function Calling

Register Admanage endpoints as functions in your OpenAI API call.

JavaScript (OpenAI SDK)
// Example: OpenAI function calling with Admanage
const response = await openai.chat.completions.create({
  model: "gpt-4o",
  messages: [
    { role: "user", content: "Show me all my ad accounts" }
  ],
  tools: [
    {
      type: "function",
      function: {
        name: "list_ad_accounts",
        description: "List all ad accounts from Admanage",
        parameters: {
          type: "object",
          properties: {
            page: { type: "number", description: "Page number" },
            limit: { type: "number", description: "Results per page" }
          }
        }
      }
    }
  ]
});

// When the model calls list_ad_accounts, execute:
// GET https://api.admanage.ai/v1/adaccounts?page=1&limit=25
// Headers: { "Authorization": "Bearer YOUR_API_KEY" }

Recommended Endpoints for AI Analysis

Use CaseEndpointMethod
List ad accountsGET
Get user & workspace infoGET
Query performance reportsGET
Check batch resultsGET
Get available report fieldsGET
View campaign performanceGET
View ad set performanceGET
Launch ads from a draftPOST
Get daily ad spendGET

Tips for AI Integration

  • Use the llms.txt spec — Point your AI to api.admanage.ai/llms.txt for a machine-readable overview of all endpoints.
  • Start read-only— Begin with GET endpoints (reports, batch status, ad accounts) before enabling write operations like launching ads.
  • Poll batch status— After launching ads, use the batch status endpoint to check progress. Batches typically complete within 30–60 seconds.
  • Scope API keys— Create a dedicated API key for your AI integration so you can revoke it independently without affecting other workflows.

Meta

#

Meta groups launch, management, comments, conversions, and Meta-specific reporting shortcuts in one place.

Reporting

Public API
Dashboard:/manage/reports

Most complete public coverage. Meta supports launch, create-from-scratch campaign/ad set provisioning, reporting tables, reach composition, and top-ad discovery.

Public Endpoints
/v1/manage/create-campaign/v1/manage/create-adset/v1/reports/query/v1/reports/meta/reach-composition/v1/analytics/top-ads/v1/spend/daily
Docs Shortcuts

Meta campaign performance table

Meta/reports

Meta/Facebook campaign reporting from the shared public query endpoint.

Public API:/v1/reports/query
curl -sS "https://api.admanage.ai/v1/reports/query?accountIds=act_123456789&startDate=2026-03-01&endDate=2026-03-31&metrics=spend,impressions,clicks,ctr,cpm,results,costPerResult&groupBy=campaignName&sortBy=spend&sortDirection=DESC&limit=25" \
  -H "Authorization: Bearer YOUR_API_KEY"

Meta reach composition

Meta/reports/reach

Meta-only reach, cumulative reach, and incremental reach by month.

Public API:/v1/reports/meta/reach-composition
curl -sS "https://api.admanage.ai/v1/reports/meta/reach-composition?accountId=act_123456789&startDate=2026-01-01&endDate=2026-03-31&countries=US,CA" \
  -H "Authorization: Bearer YOUR_API_KEY"

Launching

Shared launch surfaces for Meta/Facebook and Instagram ads.

Launch Single Ads

#

Create an ad batch and dispatch to the launcher service. Supports Meta, TikTok, Snapchat, Pinterest, Axon, and Taboola. Each ad is self-contained with its own account, ad sets, and media. Set adAccountType to specify the platform. Returns immediately with batch ID for async polling.

POST/v1/launch

Returns 202 Accepted — the launch is asynchronous.

Poll GET /v1/batch-status/{adBatchId} to track progress.

Supports Facebook, TikTok, Snapchat, Pinterest, and Axon platforms.

Each ad is self-contained: platform, adAccountId, adSets, and media are specified per ad.

The default example is prefilled with the Admanage workspace/account values used in the dashboard, not placeholder IDs.

Legacy format with "creativeState" wrapper is still supported for backwards compatibility.

Set type to "single" (default), "multi", "carousel", or "flexible" per ad.

adSets must be an array of objects with at least { value, label }. String IDs like ["123"] are also accepted and auto-normalized.

Get adSets from GET /v1/adsets — the response includes value and label fields ready to pass directly.

Get page and insta IDs from GET /v1/profiles?businessId=act_xxx.

The media field accepts both videos and images. Images use type: "image" (auto-detected from extension: .png, .jpg, .gif, .webp).

If you uploaded media via POST /v1/media/upload, you can pass the returned url directly in media[].url.

adSets can also be specified at the top level of the request body (outside ads[]) to apply the same ad sets to all ads.

Typical workflow: GET /v1/adaccounts → GET /v1/profiles → GET /v1/adsets → POST /v1/launch.

promoCode (optional, Meta only): Set a coupon/promo code per ad. Must contain at least 2 letters. Allowed characters: letters, numbers, dash, underscore. Example: "SAVE10".

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "AdManage API Docs - Creative 1",      "adAccountId": "act_384730851257635",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "Launch ads faster with AdManage",      "description": "Simple API launch test",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "page": "470703006115773",      "insta": "17841471826052348",      "adSets": [        {          "value": "120249198609970456",          "label": "ABO - PRATH - V7"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"        }      ]    },    {      "adName": "AdManage API Docs - Creative 2",      "adAccountId": "act_384730851257635",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "Speed matters for media buyers",      "description": "Second creative variation",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "page": "470703006115773",      "insta": "17841471826052348",      "adSets": [        {          "value": "120249198609970456",          "label": "ABO - PRATH - V7"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"        }      ],      "promoCode": "SAVE10"    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "AdManage API Docs - Creative 1",
      "adAccountId": "act_384730851257635",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "Launch ads faster with AdManage",
      "description": "Simple API launch test",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "page": "470703006115773",
      "insta": "17841471826052348",
      "adSets": [
        {
          "value": "120249198609970456",
          "label": "ABO - PRATH - V7"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"
        }
      ]
    },
    {
      "adName": "AdManage API Docs - Creative 2",
      "adAccountId": "act_384730851257635",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "Speed matters for media buyers",
      "description": "Second creative variation",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "page": "470703006115773",
      "insta": "17841471826052348",
      "adSets": [
        {
          "value": "120249198609970456",
          "label": "ABO - PRATH - V7"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"
        }
      ],
      "promoCode": "SAVE10"
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 9912,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch Multi-Placement Ads

#

Meta only. Launch a multi-placement ad with multiple media items. Each media item becomes a separate placement (e.g. Feed, Story, Reel).

POST/v1/launch

This ad type is Meta (Facebook/Instagram) only.

Set type to "multi" for multi-placement ads.

Each media item maps to a different placement (Feed, Story, Reel, etc.).

The platform assigns placements based on media aspect ratios.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Multi-Placement Spring Sale",      "adAccountId": "act_123456789",      "type": "multi",      "title": "Spring Sale",      "description": "Shop our collection",      "cta": "SHOP_NOW",      "link": "https://example.com",      "page": "470703006115773",      "insta": "17841471826052348",      "adSets": [        {          "value": "120012345678901234",          "label": "US Broad 25-44"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"        },        {          "url": "https://media.admanage.ai/admanage.ai/2retest_edemo1hhjLNgl7.mp4"        },        {          "url": "https://media.admanage.ai/admanage.ai/PT-Desk-Ad-David.mp4"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Multi-Placement Spring Sale",
      "adAccountId": "act_123456789",
      "type": "multi",
      "title": "Spring Sale",
      "description": "Shop our collection",
      "cta": "SHOP_NOW",
      "link": "https://example.com",
      "page": "470703006115773",
      "insta": "17841471826052348",
      "adSets": [
        {
          "value": "120012345678901234",
          "label": "US Broad 25-44"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"
        },
        {
          "url": "https://media.admanage.ai/admanage.ai/2retest_edemo1hhjLNgl7.mp4"
        },
        {
          "url": "https://media.admanage.ai/admanage.ai/PT-Desk-Ad-David.mp4"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "b2c3d4e5",
  "adBatchId": 9913,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch Carousel Ads

#

Meta only. Launch a carousel ad with multiple swipeable cards. Each media item becomes one card in the carousel.

POST/v1/launch

This ad type is Meta (Facebook/Instagram) only.

Set type to "carousel" for carousel ads.

Each media item becomes one swipeable card and must include carouselTitle.

carouselDescription is optional per card.

carouselLink is optional per card and falls back to the ad-level link when omitted.

Card order follows the media array. carouselIndex is optional metadata if you want to label positions explicitly.

Supports both images and videos as carousel cards.

Meta supports 2-10 cards per carousel.

Include page and insta for Meta launches.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Carousel - Product Lineup",      "adAccountId": "act_123456789",      "type": "carousel",      "title": "Spring Collection",      "description": "Swipe to explore",      "cta": "SHOP_NOW",      "link": "https://example.com",      "page": "470703006115773",      "insta": "17841471826052348",      "adSets": [        {          "value": "120012345678901234",          "label": "US Broad 25-44"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/card-1.jpg",          "carouselTitle": "Product A",          "carouselDescription": "Best seller",          "carouselLink": "https://example.com/products/a",          "carouselIndex": 0        },        {          "url": "https://media.admanage.ai/admanage.ai/card-2.mp4",          "carouselTitle": "Product B",          "carouselDescription": "New arrival",          "carouselLink": "https://example.com/products/b",          "carouselIndex": 1        },        {          "url": "https://media.admanage.ai/admanage.ai/card-3.jpg",          "carouselTitle": "Product C",          "carouselIndex": 2        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Carousel - Product Lineup",
      "adAccountId": "act_123456789",
      "type": "carousel",
      "title": "Spring Collection",
      "description": "Swipe to explore",
      "cta": "SHOP_NOW",
      "link": "https://example.com",
      "page": "470703006115773",
      "insta": "17841471826052348",
      "adSets": [
        {
          "value": "120012345678901234",
          "label": "US Broad 25-44"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/card-1.jpg",
          "carouselTitle": "Product A",
          "carouselDescription": "Best seller",
          "carouselLink": "https://example.com/products/a",
          "carouselIndex": 0
        },
        {
          "url": "https://media.admanage.ai/admanage.ai/card-2.mp4",
          "carouselTitle": "Product B",
          "carouselDescription": "New arrival",
          "carouselLink": "https://example.com/products/b",
          "carouselIndex": 1
        },
        {
          "url": "https://media.admanage.ai/admanage.ai/card-3.jpg",
          "carouselTitle": "Product C",
          "carouselIndex": 2
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "c3d4e5f6",
  "adBatchId": 9914,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch Flexible Ads

#

Meta only. Launch a flexible ad (Advantage+ Creative) where Meta dynamically selects which media and text combinations to show for best performance.

POST/v1/launch

This ad type is Meta (Facebook/Instagram) only.

Set type to "flexible" for Advantage+ Creative / flexible ads.

Meta automatically tests combinations of your media and text.

Provide 1+ media items. Multiple items give Meta more combinations to test.

headlineVariations and bodyVariations are optional. If omitted, Meta falls back to the top-level title and description.

Supports both images and videos.

Include page and insta for Meta launches.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Flexible - Spring Sale",      "adAccountId": "act_123456789",      "type": "flexible",      "title": "Spring Sale",      "description": "Shop our collection",      "adDescription": "Limited time offer",      "cta": "SHOP_NOW",      "link": "https://example.com",      "page": "470703006115773",      "insta": "17841471826052348",      "headlineVariations": [        "Spring Sale",        "Fresh arrivals",        "Trending now"      ],      "bodyVariations": [        "Shop our collection",        "New season, new offers",        "Meta will test the best combination"      ],      "adSets": [        {          "value": "120012345678901234",          "label": "US Broad 25-44"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/flexible-1.jpg"        },        {          "url": "https://media.admanage.ai/admanage.ai/flexible-2.mp4"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Flexible - Spring Sale",
      "adAccountId": "act_123456789",
      "type": "flexible",
      "title": "Spring Sale",
      "description": "Shop our collection",
      "adDescription": "Limited time offer",
      "cta": "SHOP_NOW",
      "link": "https://example.com",
      "page": "470703006115773",
      "insta": "17841471826052348",
      "headlineVariations": [
        "Spring Sale",
        "Fresh arrivals",
        "Trending now"
      ],
      "bodyVariations": [
        "Shop our collection",
        "New season, new offers",
        "Meta will test the best combination"
      ],
      "adSets": [
        {
          "value": "120012345678901234",
          "label": "US Broad 25-44"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/flexible-1.jpg"
        },
        {
          "url": "https://media.admanage.ai/admanage.ai/flexible-2.mp4"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "d4e5f6g7",
  "adBatchId": 9915,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch Ads From Draft

#

Re-launch an existing ad batch (draft or previously failed) by its batch ID.

POST/v1/launch/from-draft

Returns 202 Accepted — the launch is asynchronous.

The batch must belong to the authenticated company.

curl https://api.admanage.ai/v1/launch/from-draft \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "batchId": 9911}'

Request Body

{
  "batchId": 9911
}

Response

{
  "success": true,
  "message": "Ad launch initiated from draft",
  "adBatchSlug": "batch-abc123",
  "adBatchId": 9911,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Check Batch Status

#

Lightweight status polling endpoint for launch progress. Poll this after launching until status is "success" or "error".

GET/v1/batch-status/{id}

Poll this endpoint after POST /v1/launch to track progress.

Use `summaryStatus` for the simple lifecycle: "in_progress", "success", or "error".

`status` and `rawStatus` are preserved for compatibility with existing polling clients.

When status is "processing", progress shows percentage complete.

When status is "success", all ads have been launched.

curl https://api.admanage.ai/v1/batch-status/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "status": "success",
  "summaryStatus": "success",
  "rawStatus": "Success",
  "progress": 100,
  "totalAds": 20,
  "successfulAds": 20,
  "failedAds": [],
  "message": "Ad batch processing completed successfully",
  "elapsedTimeMs": 8421,
  "elapsedTimeSeconds": 8
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Managing

Duplication, budgeting, status updates, listing, and editing for Meta entities.

Create Meta Campaign

#

Create a Meta campaign from scratch. Supports core campaign setup plus the advanced budgeting, bidding, promoted-object, and Advantage+/SKAN fields used by the /manage flow.

POST/v1/manage/create-campaign

Required: `businessId` (Meta ad account), `name`, and `objective`.

Budgeting: send `dailyBudget` or `lifetimeBudget` in account currency. Campaign budgets are converted to Meta minor units automatically.

Supported objectives include `OUTCOME_TRAFFIC`, `OUTCOME_ENGAGEMENT`, `OUTCOME_LEADS`, `OUTCOME_AWARENESS`, `OUTCOME_SALES`, and `OUTCOME_APP_PROMOTION`.

For `OUTCOME_SALES`, destination choice happens on the ad set, not the campaign. Campaign-level sales examples mainly differ between standard sales campaigns and catalog-bound Advantage+ sales campaigns.

Advanced options accepted by the public API include `buyingType`, `specialAdCategories`, `bidStrategy`, `campaignBidAmount`, `campaignSpendCap`, `campaignBudgetOptimization`, `campaignBudgetType`, `isAdvantagePlusCampaign`, and `isSkadnetworkAttribution`.

Use `promotedObject` for conversion/app workflows, for example `{ pixel_id, custom_event_type }` on sales campaigns or `{ application_id, object_store_url }` on app-promotion campaigns.

The API accepts both camelCase and common Meta snake_case aliases for advanced create payloads.

Typical workflow: create the campaign first, then create one or more ad sets with `POST /v1/manage/create-adset`, then launch creatives with `POST /v1/launch`.

curl https://api.admanage.ai/v1/manage/create-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "act_384730851257635",  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",  "name": "API Docs - Prospecting Campaign",  "objective": "OUTCOME_TRAFFIC",  "status": "PAUSED",  "buyingType": "AUCTION",  "specialAdCategories": [],  "dailyBudget": 100,  "bidStrategy": "LOWEST_COST_WITHOUT_CAP",  "campaignSpendCap": 5000,  "isAdvantagePlusCampaign": false,  "promotedObject": {    "pixel_id": "123456789012345"  }}'

Request Body

{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "name": "API Docs - Prospecting Campaign",
  "objective": "OUTCOME_TRAFFIC",
  "status": "PAUSED",
  "buyingType": "AUCTION",
  "specialAdCategories": [],
  "dailyBudget": 100,
  "bidStrategy": "LOWEST_COST_WITHOUT_CAP",
  "campaignSpendCap": 5000,
  "isAdvantagePlusCampaign": false,
  "promotedObject": {
    "pixel_id": "123456789012345"
  }
}

Response

{
  "success": true,
  "campaignId": "120251616228380456",
  "campaign": {
    "id": "120251616228380456",
    "name": "API Docs - Prospecting Campaign",
    "objective": "OUTCOME_TRAFFIC",
    "status": "PAUSED",
    "buying_type": "AUCTION"
  }
}

Additional Examples

Sales campaign: standard website sales

Use a standard `OUTCOME_SALES` campaign when the website destination and purchase tracking will be configured on the ad set.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "name": "API Docs - Sales Website Campaign",
  "objective": "OUTCOME_SALES",
  "status": "PAUSED",
  "buyingType": "AUCTION",
  "specialAdCategories": [],
  "dailyBudget": 150,
  "bidStrategy": "LOWEST_COST_WITHOUT_CAP",
  "isAdvantagePlusCampaign": false
}
Response
{
  "success": true,
  "campaignId": "120251616228380457",
  "campaign": {
    "id": "120251616228380457",
    "name": "API Docs - Sales Website Campaign",
    "objective": "OUTCOME_SALES",
    "status": "PAUSED",
    "buying_type": "AUCTION"
  }
}
Sales campaign: value-focused CBO

Use campaign budget optimization with a cap strategy when you want one shared budget across multiple sales ad sets.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "name": "API Docs - Sales CBO Campaign",
  "objective": "OUTCOME_SALES",
  "status": "PAUSED",
  "buyingType": "AUCTION",
  "specialAdCategories": [],
  "dailyBudget": 250,
  "bidStrategy": "COST_CAP",
  "campaignBidAmount": 45,
  "campaignBudgetOptimization": true,
  "isAdvantagePlusCampaign": true
}
Response
{
  "success": true,
  "campaignId": "120251616228380458",
  "campaign": {
    "id": "120251616228380458",
    "name": "API Docs - Sales CBO Campaign",
    "objective": "OUTCOME_SALES",
    "status": "PAUSED",
    "buying_type": "AUCTION"
  }
}
Sales campaign: Advantage+ catalog

Attach `promotedObject.product_catalog_id` when creating a catalog-bound Advantage+ sales campaign.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "name": "API Docs - Advantage+ Catalog Sales",
  "objective": "OUTCOME_SALES",
  "status": "PAUSED",
  "buyingType": "AUCTION",
  "specialAdCategories": [],
  "dailyBudget": 300,
  "bidStrategy": "LOWEST_COST_WITHOUT_CAP",
  "campaignBudgetOptimization": true,
  "isAdvantagePlusCampaign": true,
  "promotedObject": {
    "product_catalog_id": "9988776655"
  }
}
Response
{
  "success": true,
  "campaignId": "120251616228380459",
  "campaign": {
    "id": "120251616228380459",
    "name": "API Docs - Advantage+ Catalog Sales",
    "objective": "OUTCOME_SALES",
    "status": "PAUSED",
    "buying_type": "AUCTION"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Create Meta Ad Set

#

Create a Meta ad set from scratch under an existing campaign. Supports destination setup, promoted objects, bidding, attribution, Advantage Audience retries, and optional post-create budget schedules.

POST/v1/manage/create-adset

Required: `businessId`, `campaignId`, and `name`.

Budgeting: send `dailyBudget` or `lifetimeBudget` in account currency. Lifetime budgets require `endTime`.

Destination and optimization settings follow campaign objective rules. If `optimizationGoal` is omitted, the API infers a Meta-compatible default from the parent campaign objective.

Sales ad sets commonly use `destinationType` values such as `WEBSITE`, `WEBSITE_AND_PHONE_CALL`, `MESSAGING_INSTAGRAM_DIRECT_MESSENGER`, `MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP`, and `PHONE_CALL`.

Supported advanced fields include `billingEvent`, `bidStrategy`, `bidAmount`, `destinationType`, `promotedObject`, `attributionSpec`, `startTime`, `endTime`, `pacingType`, `existingCustomerBudgetPercentage`, `placementSoftOptOut`, `targeting`, `dsaBeneficiary`, `dsaPayor`, `valueRuleSetId`, `valueRulesApplied`, `dailyMinSpendTarget`, `dailySpendCap`, `lifetimeMinSpendTarget`, and `lifetimeSpendCap`.

If Meta rejects the request because Advantage Audience targeting automation is missing or incompatible, the API retries with the same fallback logic used in `/manage`.

Budget schedules are supported via `budgetSchedules`/`budget_schedules` and are applied after the ad set is created.

Lead-generation ad sets generally need a lead-gen compatible campaign objective and promoted object. Messenger/DM destinations should use the matching destination/optimization combination.

The API accepts both camelCase and common Meta snake_case aliases for advanced create payloads.

curl https://api.admanage.ai/v1/manage/create-adset \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "act_384730851257635",  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",  "campaignId": "120251616228380456",  "name": "API Docs - Traffic Ad Set",  "status": "PAUSED",  "dailyBudget": 25,  "billingEvent": "IMPRESSIONS",  "optimizationGoal": "LANDING_PAGE_VIEWS",  "destinationType": "WEBSITE",  "targeting": {    "geo_locations": {      "countries": [        "US"      ]    },    "age_min": 21,    "age_max": 55,    "publisher_platforms": [      "facebook",      "instagram"    ]  },  "promotedObject": {    "pixel_id": "123456789012345"  },  "attributionSpec": [    {      "event_type": "CLICK_THROUGH",      "window_days": 7    }  ]}'

Request Body

{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380456",
  "name": "API Docs - Traffic Ad Set",
  "status": "PAUSED",
  "dailyBudget": 25,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "LANDING_PAGE_VIEWS",
  "destinationType": "WEBSITE",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US"
      ]
    },
    "age_min": 21,
    "age_max": 55,
    "publisher_platforms": [
      "facebook",
      "instagram"
    ]
  },
  "promotedObject": {
    "pixel_id": "123456789012345"
  },
  "attributionSpec": [
    {
      "event_type": "CLICK_THROUGH",
      "window_days": 7
    }
  ]
}

Response

{
  "success": true,
  "adSetId": "120251616242460456",
  "adSet": {
    "id": "120251616242460456",
    "name": "API Docs - Traffic Ad Set",
    "campaign_id": "120251616228380456",
    "status": "PAUSED",
    "optimization_goal": "LANDING_PAGE_VIEWS"
  }
}

Additional Examples

Sales ad set: website purchases

Standard website sales ad set using pixel purchase tracking and `OFFSITE_CONVERSIONS`.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380457",
  "name": "API Docs - Sales Website Purchases",
  "status": "PAUSED",
  "dailyBudget": 50,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "OFFSITE_CONVERSIONS",
  "destinationType": "WEBSITE",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US"
      ]
    },
    "age_min": 25,
    "age_max": 54
  },
  "promotedObject": {
    "pixel_id": "123456789012345",
    "custom_event_type": "PURCHASE"
  }
}
Response
{
  "success": true,
  "adSetId": "120251616242460457",
  "adSet": {
    "id": "120251616242460457",
    "name": "API Docs - Sales Website Purchases",
    "campaign_id": "120251616228380457",
    "status": "PAUSED",
    "optimization_goal": "OFFSITE_CONVERSIONS"
  }
}
Sales ad set: website value / ROAS

Use `VALUE` when you want Meta to optimize for conversion value instead of conversion count.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380458",
  "name": "API Docs - Sales Value Ad Set",
  "status": "PAUSED",
  "dailyBudget": 75,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "VALUE",
  "destinationType": "WEBSITE",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US",
        "CA"
      ]
    },
    "age_min": 25,
    "age_max": 54
  },
  "promotedObject": {
    "pixel_id": "123456789012345",
    "custom_event_type": "PURCHASE"
  },
  "valueRulesApplied": true,
  "valueRuleSetId": "120200000000000001"
}
Response
{
  "success": true,
  "adSetId": "120251616242460458",
  "adSet": {
    "id": "120251616242460458",
    "name": "API Docs - Sales Value Ad Set",
    "campaign_id": "120251616228380458",
    "status": "PAUSED",
    "optimization_goal": "VALUE"
  }
}
Sales ad set: website and phone calls

Use `WEBSITE_AND_PHONE_CALL` when the ad set should optimize for website conversion intent and call-driven creatives. The phone number itself is provided later on the ad creative.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380457",
  "name": "API Docs - Sales Website and Calls",
  "status": "PAUSED",
  "dailyBudget": 60,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "OFFSITE_CONVERSIONS",
  "destinationType": "WEBSITE_AND_PHONE_CALL",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US"
      ]
    },
    "age_min": 30,
    "age_max": 65
  },
  "promotedObject": {
    "pixel_id": "123456789012345",
    "custom_event_type": "PURCHASE"
  }
}
Response
{
  "success": true,
  "adSetId": "120251616242460459",
  "adSet": {
    "id": "120251616242460459",
    "name": "API Docs - Sales Website and Calls",
    "campaign_id": "120251616228380457",
    "status": "PAUSED",
    "optimization_goal": "OFFSITE_CONVERSIONS"
  }
}
Sales ad set: messaging destinations

Sales messaging ad sets use a page-backed promoted object and a messaging destination such as Messenger/Instagram DMs or WhatsApp.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380457",
  "name": "API Docs - Sales Messaging Ad Set",
  "status": "PAUSED",
  "dailyBudget": 40,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "OFFSITE_CONVERSIONS",
  "destinationType": "MESSAGING_INSTAGRAM_DIRECT_MESSENGER_WHATSAPP",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US"
      ]
    },
    "age_min": 21,
    "age_max": 55
  },
  "promotedObject": {
    "page_id": "470703006115773"
  }
}
Response
{
  "success": true,
  "adSetId": "120251616242460460",
  "adSet": {
    "id": "120251616242460460",
    "name": "API Docs - Sales Messaging Ad Set",
    "campaign_id": "120251616228380457",
    "status": "PAUSED",
    "optimization_goal": "OFFSITE_CONVERSIONS"
  }
}
Sales ad set: calls only

Use `PHONE_CALL` when the sales flow is handled over the phone. No campaign-level promoted object is required for the ad set.

Request Body
{
  "businessId": "act_384730851257635",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "120251616228380457",
  "name": "API Docs - Sales Calls Ad Set",
  "status": "PAUSED",
  "dailyBudget": 35,
  "billingEvent": "IMPRESSIONS",
  "optimizationGoal": "OFFSITE_CONVERSIONS",
  "destinationType": "PHONE_CALL",
  "targeting": {
    "geo_locations": {
      "countries": [
        "US"
      ]
    },
    "age_min": 30,
    "age_max": 65
  }
}
Response
{
  "success": true,
  "adSetId": "120251616242460461",
  "adSet": {
    "id": "120251616242460461",
    "name": "API Docs - Sales Calls Ad Set",
    "campaign_id": "120251616228380457",
    "status": "PAUSED",
    "optimization_goal": "OFFSITE_CONVERSIONS"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Ad Set

#

Duplicate a Facebook ad set (1-10 copies). Uses smartCopy with async batch fallback for large ad sets.

POST/v1/manage/duplicate-adset

copyCount must be 1-10.

deepCopy (default true): also copies all ads within the ad set.

targetCampaignId: optional, duplicates into a different campaign.

newName: optional, renames the duplicated ad set(s). Response includes renamed (bool) and newName per copy.

Errors include Facebook error codes/subcodes for debugging. Common errors:

- Instagram Explore placement: must be selected alongside Explore Home (Facebook validation).

- Error 1885194: ad set too large for sync copy — the API automatically retries with async batch.

- Error 2446173: asset label issues — retried without ads attached.

- Transient errors (code 2) are automatically retried up to 3 times with backoff.

curl https://api.admanage.ai/v1/manage/duplicate-adset \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adsetId": "120248289622780456",  "accountId": "act_123456789",  "copyCount": 2,  "initialStatus": "PAUSED",  "deepCopy": true,  "newName": "My Ad Set Copy",  "workspaceId": "workspace_abc"}'

Request Body

{
  "adsetId": "120248289622780456",
  "accountId": "act_123456789",
  "copyCount": 2,
  "initialStatus": "PAUSED",
  "deepCopy": true,
  "newName": "My Ad Set Copy",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "originalAdSetId": "120248289622780456",
  "results": [
    {
      "copyNumber": 1,
      "success": true,
      "newAdSetId": "120248289622780457",
      "renamed": true,
      "newName": "My Ad Set Copy"
    },
    {
      "copyNumber": 2,
      "success": true,
      "newAdSetId": "120248289622780458",
      "renamed": true,
      "newName": "My Ad Set Copy"
    }
  ],
  "successCount": 2,
  "failCount": 0
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Campaign

#

Duplicate a Facebook campaign (1-10 copies). Uses smartCopy with async batch fallback for large campaigns.

POST/v1/manage/duplicate-campaign

copyCount must be 1-10.

deepCopy (default true): also copies all ad sets and ads within the campaign.

newName: optional, renames the duplicated campaign(s). Response includes renamed (bool) and newName per copy.

curl https://api.admanage.ai/v1/manage/duplicate-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "120247699100220456",  "accountId": "act_123456789",  "copyCount": 1,  "initialStatus": "PAUSED",  "deepCopy": true,  "newName": "My Campaign Copy",  "workspaceId": "workspace_abc"}'

Request Body

{
  "campaignId": "120247699100220456",
  "accountId": "act_123456789",
  "copyCount": 1,
  "initialStatus": "PAUSED",
  "deepCopy": true,
  "newName": "My Campaign Copy",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "originalCampaignId": "120247699100220456",
  "results": [
    {
      "copyNumber": 1,
      "success": true,
      "newCampaignId": "120247699100220457",
      "renamed": true,
      "newName": "My Campaign Copy"
    }
  ],
  "successCount": 1,
  "failCount": 0
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Ad

#

Duplicate a Facebook ad with optional creative modifications. Falls back to recreation on pixel/lead form errors.

POST/v1/manage/duplicate-ad

copyCount must be 1-10.

copyValues: optional creative modifications (primaryText1-5, headline1-5, url, urlTags, adName).

On error codes 1634013/3390001, automatically attempts recreation fallback.

method in results: 'copies' (standard) or 'recreation' (fallback).

curl https://api.admanage.ai/v1/manage/duplicate-ad \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adId": "120012345678901234",  "accountId": "act_123456789",  "targetAdSetId": "120248289622780456",  "copyCount": 1,  "initialStatus": "PAUSED",  "copyValues": {    "primaryText1": "New primary text",    "headline1": "New headline",    "adName": "My Ad Copy"  },  "workspaceId": "workspace_abc"}'

Request Body

{
  "adId": "120012345678901234",
  "accountId": "act_123456789",
  "targetAdSetId": "120248289622780456",
  "copyCount": 1,
  "initialStatus": "PAUSED",
  "copyValues": {
    "primaryText1": "New primary text",
    "headline1": "New headline",
    "adName": "My Ad Copy"
  },
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "originalAdId": "120012345678901234",
  "results": [
    {
      "copyNumber": 1,
      "success": true,
      "newAdId": "120012345678901235",
      "method": "copies"
    }
  ],
  "successCount": 1,
  "failCount": 0
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Change History

#

Fetch Meta activity history for an ad account. Returns changes to campaigns, ad sets, and ads — including budget, bid cap, status, and targeting modifications with old/new values and timestamps.

GET/v1/manage/changes

Query Parameters

?businessId=act_123456789&objectId=120247699100220456&since=1710000000&until=1710300000&workspaceId=workspace_abc&limit=50

businessId (required): the ad account ID (e.g. act_123456789).

objectId (optional): filter to a specific campaign, ad set, or ad ID.

since / until (optional): Unix timestamps to define a date range.

limit: 1-100, default 50.

Budget values are in minor units (cents). Divide by 100 for the display amount.

Changes include: budget, bid cap, cost cap, status, targeting, schedule, and more.

curl https://api.admanage.ai/v1/manage/changes \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "eventTime": 1710300000,
      "dateTimeInTimezone": "2026-03-13T10:00:00-0400",
      "eventType": "update_ad_set_budget",
      "translatedEventType": "Updated Ad Set Budget",
      "objectId": "120247699100220456",
      "objectName": "My Ad Set",
      "objectType": "adset",
      "actorId": "67890",
      "actorName": "Jane Doe",
      "changes": {
        "daily_budget": {
          "old": 5000,
          "new": 10000
        },
        "bid_amount": {
          "old": 200,
          "new": 350
        }
      }
    }
  ],
  "paging": {
    "cursors": {
      "before": "abc",
      "after": "xyz"
    }
  },
  "metadata": {
    "businessId": "act_123456789",
    "objectId": "120247699100220456",
    "count": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Ads in Ad Set

#

List ads in a Facebook ad set or ad account directly from the Graph API. Returns ad ID, name, status, effective status, created time, and thumbnail URL. Use this to see which ads exist before deleting, editing, or making room for new launches.

GET/v1/manage/list-ads

Query Parameters

?adSetId=120248289622780456&limit=50&workspaceId=workspace_abc

Either adSetId or accountId is required. adSetId lists ads in a specific ad set; accountId lists all ads in the account.

status (optional): filter by effective status — ACTIVE, PAUSED, ARCHIVED, DELETED.

limit: 1-200, default 50.

Pair with POST /v1/manage/delete to remove underperforming ads and free up slots before launching new ones.

curl https://api.admanage.ai/v1/manage/list-ads \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": "120249137908810789",
      "name": "Video Ad - US Broad",
      "status": "ACTIVE",
      "effectiveStatus": "ACTIVE",
      "createdTime": "2026-02-18T08:25:12+0000",
      "thumbnailUrl": "https://scontent.xx.fbcdn.net/v/t45.1600-4/..."
    },
    {
      "id": "120249137908810790",
      "name": "Image Ad - Retargeting",
      "status": "PAUSED",
      "effectiveStatus": "PAUSED",
      "createdTime": "2026-02-10T14:00:00+0000",
      "thumbnailUrl": null
    }
  ],
  "count": 2
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Pause, Resume, or End Ads / Ad Sets / Campaigns

#

One endpoint for three things: (1) PAUSE — stop delivery immediately. (2) RESUME — re-activate a paused entity. (3) END — schedule when delivery stops via endTime (or end immediately by setting endTime in the past). Works for campaigns, ad sets, and ads on Meta and TikTok. Platform is auto-detected from businessId (act_ = Meta, numeric = TikTok). The entity does NOT need to be synced to AdManage — the ID is passed straight through to the platform's API.

POST/v1/manage/update-status

PAUSE immediately: newStatus='PAUSED' (Meta) or 'DISABLE' (TikTok). Omit endTime.

RESUME a paused entity: newStatus='ACTIVE' (Meta) or 'ENABLE' (TikTok). Omit endTime.

END on a schedule (Meta only): newStatus='ACTIVE' + endTime (ISO 8601, e.g. '2026-04-22T23:59:59+0000'). Delivery keeps running until endTime, then stops.

EXTEND or CHANGE an existing end date: call again with a new endTime — it overwrites the previous one.

entityType: 'campaigns', 'adsets', or 'ads'.

Meta statuses: 'ACTIVE' or 'PAUSED'. TikTok statuses: 'ENABLE' or 'DISABLE'.

Platform is auto-detected: act_ prefix = Meta, numeric = TikTok.

endTime is Meta-only; TikTok ignores it.

curl https://api.admanage.ai/v1/manage/update-status \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "entityId": "120249137908810789",  "entityType": "adsets",  "newStatus": "PAUSED",  "businessId": "act_384730851257635",  "workspaceId": "workspace_abc"}'

Request Body

{
  "entityId": "120249137908810789",
  "entityType": "adsets",
  "newStatus": "PAUSED",
  "businessId": "act_384730851257635",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "entityId": "120249137908810789",
    "entityType": "adsets",
    "status": "PAUSED"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Campaign Budget

#

Set the daily or lifetime budget for a Meta campaign. Inputs are dollars; the response includes both dollars and cents. When using lifetimeBudget, provide endTime (ISO 8601).

POST/v1/manage/update-campaign-budget

Use campaignId in the request body.

Provide exactly one of dailyBudget or lifetimeBudget.

Budget values must be non-negative numbers in account currency dollars, not cents.

endTime (optional, ISO 8601): required when using lifetimeBudget — Meta needs an end date for lifetime budgets.

Meta does not allow switching from daily to lifetime budget on an existing entity. Lifetime budget must be set at creation time.

Response budget.amountDollars is the public API amount. budget.amountCents is the internal Meta minor-unit value used for the mutation.

curl https://api.admanage.ai/v1/manage/update-campaign-budget \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "120247699100220456",  "businessId": "act_384730851257635",  "dailyBudget": 150,  "workspaceId": "workspace_abc"}'

Request Body

{
  "campaignId": "120247699100220456",
  "businessId": "act_384730851257635",
  "dailyBudget": 150,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "success": true
  },
  "campaignId": "120247699100220456",
  "entityType": "campaigns",
  "businessId": "act_384730851257635",
  "budget": {
    "field": "daily_budget",
    "amountDollars": 150,
    "amountCents": 15000
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Ad Set Budget

#

Set the daily or lifetime budget for a Meta ad set. Inputs are dollars; the response includes both dollars and cents. When using lifetimeBudget, provide endTime (ISO 8601).

POST/v1/manage/update-adset-budget

Use adsetId in the request body.

Provide exactly one of dailyBudget or lifetimeBudget.

Budget values must be non-negative numbers in account currency dollars, not cents.

endTime (optional, ISO 8601): required when using lifetimeBudget — Meta needs an end date for lifetime budgets.

Meta does not allow switching from daily to lifetime budget on an existing ad set. Lifetime budget must be set at creation time.

Response budget.amountDollars is the public API amount. budget.amountCents is the internal Meta minor-unit value used for the mutation.

curl https://api.admanage.ai/v1/manage/update-adset-budget \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adsetId": "120249483901820456",  "businessId": "act_384730851257635",  "dailyBudget": 25,  "workspaceId": "workspace_abc"}'

Request Body

{
  "adsetId": "120249483901820456",
  "businessId": "act_384730851257635",
  "dailyBudget": 25,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "success": true
  },
  "adsetId": "120249483901820456",
  "entityType": "adsets",
  "businessId": "act_384730851257635",
  "budget": {
    "field": "daily_budget",
    "amountDollars": 25,
    "amountCents": 2500
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Campaign Bidding

#

Update Meta bidding for a campaign. Only supported for AUCTION campaigns using campaign budget optimization (CBO). For capped strategies, AdManage sends Meta the required adset_bid_amounts map for all child ad sets in the campaign update request.

POST/v1/manage/update-campaign-bidding

Use campaignId in the request body.

Campaign bidding only applies to AUCTION + CBO campaigns. ABO campaigns must be updated at the ad set level.

Provide bidStrategy, bidAmount, or both.

For LOWEST_COST_WITH_BID_CAP, COST_CAP, and TARGET_COST, bidAmount is required unless all child ad sets already have bid_amount values.

When toggling a CBO campaign from autobid to a capped campaign strategy, Meta requires an adset_bid_amounts map for every non-deleted child ad set.

bidAmount is in account currency dollars. The response also includes Meta minor units in bidding.bidAmountCents.

curl https://api.admanage.ai/v1/manage/update-campaign-bidding \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "120247699100220456",  "businessId": "act_384730851257635",  "bidStrategy": "LOWEST_COST_WITH_BID_CAP",  "bidAmount": 35,  "workspaceId": "workspace_abc"}'

Request Body

{
  "campaignId": "120247699100220456",
  "businessId": "act_384730851257635",
  "bidStrategy": "LOWEST_COST_WITH_BID_CAP",
  "bidAmount": 35,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "success": true
  },
  "campaignId": "120247699100220456",
  "entityType": "campaigns",
  "businessId": "act_384730851257635",
  "bidding": {
    "bidStrategy": "LOWEST_COST_WITH_BID_CAP",
    "bidAmountDollars": 35,
    "bidAmountCents": 3500,
    "scope": "campaign",
    "updatedChildAdsets": 3
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Ad Set Bidding

#

Update Meta bidding for an ad set. Supports switching bid_strategy and changing bid_amount for capped strategies.

POST/v1/manage/update-adset-bidding

Use adsetId in the request body.

Provide bidStrategy, bidAmount, or both.

For LOWEST_COST_WITH_BID_CAP, COST_CAP, and TARGET_COST, bidAmount is required unless the ad set already has a bid_amount stored on Meta.

bidAmount is in account currency dollars. The response also includes Meta minor units in bidding.bidAmountCents.

curl https://api.admanage.ai/v1/manage/update-adset-bidding \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adsetId": "120249483901820456",  "businessId": "act_384730851257635",  "bidStrategy": "COST_CAP",  "bidAmount": 12.5,  "workspaceId": "workspace_abc"}'

Request Body

{
  "adsetId": "120249483901820456",
  "businessId": "act_384730851257635",
  "bidStrategy": "COST_CAP",
  "bidAmount": 12.5,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "success": true
  },
  "adsetId": "120249483901820456",
  "entityType": "adsets",
  "businessId": "act_384730851257635",
  "bidding": {
    "bidStrategy": "COST_CAP",
    "bidAmountDollars": 12.5,
    "bidAmountCents": 1250,
    "scope": "adset"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Edit Existing Ads

#

Batch edit existing Facebook ads — change ad name, primary text, headlines, descriptions, URL, CTA, UTM tags, creative enhancements, or schedule.

POST/v1/manage/edit-ads

Fast fields (direct update): adName, urlTags, ad_schedule_start_time, ad_schedule_end_time.

Creative fields (rebuild via launcher): primaryText1-5, headline1-5, description1-5, url, cta, creativeEnhancements.

creativeEnhancements: 'on' or 'off'.

curl https://api.admanage.ai/v1/manage/edit-ads \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "act_384730851257635",  "ads": [    {      "adId": "120249137908810789",      "copyValues": {        "adName": "New Ad Name",        "primaryText1": "Updated primary text",        "headline1": "New headline",        "url": "https://example.com/landing",        "urlTags": "utm_source=facebook&utm_medium=cpc",        "cta": "SHOP_NOW"      }    }  ]}'

Request Body

{
  "accountId": "act_384730851257635",
  "ads": [
    {
      "adId": "120249137908810789",
      "copyValues": {
        "adName": "New Ad Name",
        "primaryText1": "Updated primary text",
        "headline1": "New headline",
        "url": "https://example.com/landing",
        "urlTags": "utm_source=facebook&utm_medium=cpc",
        "cta": "SHOP_NOW"
      }
    }
  ]
}

Response

{
  "success": true,
  "data": {}
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Lead Forms

#

List active lead forms for a Facebook Page. Required when launching into a lead gen ad set (objective = OUTCOME_LEADS). Pass the selected form's id as leadFormId in launch.

GET/v1/manage/lead-forms

Query Parameters

?pageId=123456789&workspaceId=workspace_abc

pageId (required): Facebook Page ID from get_launch_defaults or list_profiles.

Returns only ACTIVE forms, sorted by most recently created.

curl https://api.admanage.ai/v1/manage/lead-forms \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": "456789123",
      "name": "Contact Us Form",
      "status": "ACTIVE",
      "created_time": "2026-02-18T08:25:12+0000"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Refresh Ad Sets

#

Fetch or refresh ad sets from the Facebook Graph API for an ad account. Supports caching and cooldown to avoid rate limits. In most cases you do NOT need to call this directly — GET /v1/adsets auto-refreshes stale snapshots on read, and ad-set mutations (create, duplicate, update, delete) invalidate the snapshot so the next read refreshes.

POST/v1/manage/refresh-adsets

businessId (required): Facebook ad account ID (act_*).

type: 'all' (default), 'active', or 'paused'.

hardRefresh: true to bypass cache. forceRefresh: true to skip cooldown.

Only Facebook act_* accounts are supported.

Prefer GET /v1/adsets?refresh=true for ad-hoc live fetches — it auto-refreshes when stale and returns launch-ready rows. Use this endpoint only when you need the raw Meta Graph payload or fine-grained control over the refresh type.

curl https://api.admanage.ai/v1/manage/refresh-adsets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "act_384730851257635",  "type": "active",  "hardRefresh": false,  "workspaceId": "workspace_abc"}'

Request Body

{
  "businessId": "act_384730851257635",
  "type": "active",
  "hardRefresh": false,
  "workspaceId": "workspace_abc"
}

Response

{
  "data": "Secure data",
  "count": 42,
  "adSets": [
    {
      "id": "120248289622780456",
      "name": "US Broad 25-44",
      "status": "ACTIVE",
      "daily_budget": 10000
    }
  ],
  "source": "facebook",
  "cooldownActive": false
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Ad Set (Advanced)

#

Duplicate an ad set with optional targeting updates (locations, custom audiences) and ad duplication. More flexible than the basic duplicate endpoint.

POST/v1/manage/duplicate-adset-advanced

adsetId (required): source ad set ID.

duplicateAds: true to copy child ads (default false).

singleAdId: only duplicate this specific ad from the source.

locationTargeting, customAudiencesInclude, customAudiencesExclude: override targeting on the copy.

curl https://api.admanage.ai/v1/manage/duplicate-adset-advanced \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adsetId": "120248289622780456",  "accountId": "act_384730851257635",  "newAdSetName": "US Broad - Copy",  "duplicateAds": true,  "duplicateAdsStatus": "PAUSED",  "isAdSetLive": false,  "workspaceId": "workspace_abc"}'

Request Body

{
  "adsetId": "120248289622780456",
  "accountId": "act_384730851257635",
  "newAdSetName": "US Broad - Copy",
  "duplicateAds": true,
  "duplicateAdsStatus": "PAUSED",
  "isAdSetLive": false,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "postData": {
    "id": "120249999999999999"
  },
  "message": "Ad set duplicated via api-admanage",
  "usedApiAdmanage": true,
  "originalAdSetId": "120248289622780456"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Delete Ads / Ad Sets / Campaigns

#

Delete Facebook or Pinterest campaigns, ad sets, or ads (up to 100 at once). Facebook entities are soft-deleted (status set to DELETED). Pinterest entities are archived.

POST/v1/manage/delete

entityType: 'campaigns', 'adsets', or 'ads'.

entityIds: array of IDs to delete (max 100).

businessId: the ad account ID (e.g. act_123 for Meta).

platform (optional): 'facebook' or 'pinterest'. Auto-detected from businessId if omitted.

Facebook: sets status to DELETED (soft delete). Pinterest: sets status to ARCHIVED.

All entity deletions run concurrently (Promise.allSettled). Individual failures don't block other deletions.

This is destructive and cannot be undone.

curl https://api.admanage.ai/v1/manage/delete \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "entityIds": [    "120249137908810789",    "120249137908810790"  ],  "entityType": "ads",  "businessId": "act_384730851257635",  "platform": "facebook",  "workspaceId": "workspace_abc"}'

Request Body

{
  "entityIds": [
    "120249137908810789",
    "120249137908810790"
  ],
  "entityType": "ads",
  "businessId": "act_384730851257635",
  "platform": "facebook",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "results": [
    {
      "id": "120249137908810789",
      "success": true
    },
    {
      "id": "120249137908810790",
      "success": true
    }
  ],
  "successCount": 2,
  "failCount": 0
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Comments & Conversions

Meta-specific comment moderation and conversion event APIs.

Comments

#

Get Comments

#

List ad comments with filtering and pagination. Comments are collected in real-time from Facebook/Meta via webhooks, with AI-powered sentiment analysis on a 1-100 scale (1-33 negative, 34-66 neutral, 67-100 positive).

GET/v1/comments

Query Parameters

?page=1&limit=25&accountId=act_123456789&sentiment=negative&startDate=2026-03-01&endDate=2026-03-31

Sentiment scale: 1-33 = negative, 34-66 = neutral, 67-100 = positive.

Optional: accountId (or adAccountId) to filter by ad account (e.g. act_123).

Optional: adId to filter by specific ad.

Optional: sentiment — 'positive', 'neutral', or 'negative'.

Optional: hidden — 'true' or 'false' to filter by visibility.

Optional: startDate, endDate (YYYY-MM-DD) for date range.

Optional: search — case-insensitive search across comment text, author name, or ad name.

Optional: sortBy — 'commentDate' (default), 'likes', 'sentiment', or 'lastUpdated'.

Optional: sortDirection — 'ASC' or 'DESC' (default).

curl https://api.admanage.ai/v1/comments \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": 4554179,
      "commentId": "1542661021111818_1245574530890886",
      "text": "Great product, love it!",
      "author": "John Doe",
      "authorId": "26271573105814472",
      "date": "2026-03-10T14:30:00.000Z",
      "likes": 5,
      "replyCount": 2,
      "sentiment": 85,
      "sentimentLabel": "positive",
      "hidden": false,
      "adId": "120248289622780456",
      "adName": "Spring Sale - UGC",
      "accountId": "act_123456789",
      "permalink": "https://www.facebook.com/...",
      "companyReply": null,
      "companyReplyTime": null,
      "reply": null,
      "spend": null,
      "impressions": null,
      "analysis": null
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 39562,
    "totalPages": 1583
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Comment Analytics

#

Get aggregated comment analytics: sentiment distribution, top 10 ads by comment count, hidden/replied counts, and daily volume over time.

GET/v1/comments/analytics

Query Parameters

?accountId=act_123456789&startDate=2026-03-01&endDate=2026-03-31

Sentiment scale: 1-33 = negative, 34-66 = neutral, 67-100 = positive.

Optional: accountId (or adAccountId) to filter by ad account.

Optional: startDate, endDate (YYYY-MM-DD) for date range.

If no date range provided, volumeOverTime defaults to the last 30 days.

curl https://api.admanage.ai/v1/comments/analytics \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "summary": {
      "totalComments": 24347,
      "avgSentiment": 42.2,
      "analyzedComments": 24116,
      "hiddenComments": 10571,
      "commentsWithReplies": 749
    },
    "sentimentDistribution": {
      "positive": {
        "count": 5087,
        "percentage": 21
      },
      "neutral": {
        "count": 6800,
        "percentage": 28
      },
      "negative": {
        "count": 12229,
        "percentage": 51
      }
    },
    "topAds": [
      {
        "adId": "120248289622780456",
        "adName": "Spring Sale - UGC",
        "commentCount": 85,
        "avgSentiment": 72.5,
        "totalLikes": 230
      }
    ],
    "volumeOverTime": [
      {
        "date": "2026-03-01T00:00:00.000Z",
        "count": 701
      },
      {
        "date": "2026-03-02T00:00:00.000Z",
        "count": 626
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Reply to Comment

#

Reply to a Facebook ad comment. The reply is posted as the page that owns the ad.

POST/v1/comments/reply

commentId (required): Facebook comment ID from list_comments.

message (required): reply text.

workspaceId (optional): helps resolve the correct Facebook token if you have multiple workspaces.

curl https://api.admanage.ai/v1/comments/reply \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "commentId": "1542661021111818_1245574530890886",  "message": "Thanks for your feedback! Check out our website for more info.",  "workspaceId": "workspace_abc"}'

Request Body

{
  "commentId": "1542661021111818_1245574530890886",
  "message": "Thanks for your feedback! Check out our website for more info.",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "replyId": "1542661021111818_9988776655",
    "commentId": "1542661021111818_1245574530890886"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Hide Comment

#

Hide or unhide a Facebook ad comment from public view. Hidden comments are still visible to the page admin.

POST/v1/comments/hide

commentId (required): Facebook comment ID.

hide (required): true to hide, false to unhide.

workspaceId (optional): helps resolve the correct Facebook token.

curl https://api.admanage.ai/v1/comments/hide \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "commentId": "1542661021111818_1245574530890886",  "hide": true,  "workspaceId": "workspace_abc"}'

Request Body

{
  "commentId": "1542661021111818_1245574530890886",
  "hide": true,
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "commentId": "1542661021111818_1245574530890886",
    "hidden": true
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Conversions

#

List Pixels

#

List Meta pixels available on a Facebook ad account. Use the pixel ID to configure CAPI settings or when sending events.

GET/v1/conversions/pixels

Query Parameters

?businessId=act_123456789&workspaceId=ws_abc

businessId (required): The ad account ID (e.g., act_123456789).

workspaceId (optional): Scope the token lookup to a specific workspace.

Uses your company's Facebook token to query Meta Graph API.

curl https://api.admanage.ai/v1/conversions/pixels \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "pixels": [
      {
        "id": "123456789012345",
        "name": "My Website Pixel",
        "last_fired_time": "2026-03-20T12:00:00Z"
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Send Conversion Events

#

Send custom events to Meta's Conversions API (CAPI) via your configured pixel. Events appear in Meta Ads Manager for optimization. PII fields (email, phone, etc.) are automatically SHA-256 hashed before sending to Meta.

POST/v1/conversions/events

Prerequisites: Configure your Pixel ID and CAPI Access Token in Settings > Meta Conversions API for the ad account.

businessId (required): The Facebook ad account ID (e.g., act_123456789).

workspaceId (optional): For workspace-scoped config lookup.

test_event_code (optional): Include this to see events in Meta Events Manager's Test Events tab without affecting production data.

events (required): Array of 1-1000 events per request.

event_name: Any string — standard events (Purchase, Lead, CompleteRegistration) or custom names (QualifiedLead, SQL, MQL).

event_time: Unix timestamp in seconds. Must be within the last 7 days.

event_id (optional): For deduplication if you send the same event from multiple sources.

action_source: One of website, app, email, phone_call, chat, physical_store, system_generated, business_messaging, other. Falls back to your configured default.

user_data: At least one identifier required (em, ph, fn, ln, external_id, client_ip_address, fbc, fbp). Plain-text values are automatically SHA-256 hashed. Already-hashed values (64-char hex) pass through unchanged.

custom_data (optional): Arbitrary key-value pairs. Use value + currency for purchase events.

Rate limit: 50 requests per minute (each can batch up to 1000 events = 50,000 events/min).

Typical use: CRM/Google Sheets workflow triggers this endpoint when a lead status changes to SQL/MQL, sending the conversion event to Meta for ad optimization.

curl https://api.admanage.ai/v1/conversions/events \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "act_123456789",  "workspaceId": "ws_abc",  "test_event_code": "TEST12345",  "events": [    {      "event_name": "QualifiedLead",      "event_time": 1710960000,      "event_id": "unique-dedup-123",      "action_source": "other",      "user_data": {        "em": "[email protected]",        "ph": "+15551234567",        "external_id": "crm-lead-abc123",        "client_ip_address": "1.2.3.4"      },      "custom_data": {        "value": 5000,        "currency": "USD",        "lead_status": "SQL",        "crm_id": "abc123"      }    }  ]}'

Request Body

{
  "businessId": "act_123456789",
  "workspaceId": "ws_abc",
  "test_event_code": "TEST12345",
  "events": [
    {
      "event_name": "QualifiedLead",
      "event_time": 1710960000,
      "event_id": "unique-dedup-123",
      "action_source": "other",
      "user_data": {
        "em": "[email protected]",
        "ph": "+15551234567",
        "external_id": "crm-lead-abc123",
        "client_ip_address": "1.2.3.4"
      },
      "custom_data": {
        "value": 5000,
        "currency": "USD",
        "lead_status": "SQL",
        "crm_id": "abc123"
      }
    }
  ]
}

Response

{
  "success": true,
  "data": {
    "events_received": 1,
    "messages": [],
    "fbtrace_id": "AbCdEf123456"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


TikTok

#

TikTok keeps launch docs here and uses the shared reporting endpoints called out in the reporting panel.

Reporting

Partial Public API
Dashboard:/manage/reports

Shared reporting covers TikTok campaign, ad set, ad, and top-ad questions, but TikTok does not share Meta's reach-composition endpoint.

Public Endpoints
/v1/reports/query/v1/analytics/top-ads/v1/spend/daily
Docs Shortcuts

TikTok top ads

TikTok/reports/top-ads

Use this when someone asks for TikTok winners ranked by spend.

Public API:/v1/analytics/top-ads
curl -sS "https://api.admanage.ai/v1/analytics/top-ads?accountIds=7486153503963054097&startDate=2026-03-01&endDate=2026-03-31&limit=10" \
  -H "Authorization: Bearer YOUR_API_KEY"

TikTok ad performance table

TikTok/reports

Use Query Reports for TikTok campaign, ad set, and ad tables.

Public API:/v1/reports/query
curl -sS "https://api.admanage.ai/v1/reports/query?accountIds=7486153503963054097&startDate=2026-03-01&endDate=2026-03-31&metrics=spend,impressions,clicks,ctr,cpm&groupBy=adName&sortBy=spend&sortDirection=DESC&limit=25" \
  -H "Authorization: Bearer YOUR_API_KEY"

Launching

Launch TikTok ads and creatives through the shared launcher.

Launch TikTok Ads

#

Launch TikTok ads via the API. Set adAccountType to 'tiktok'. The launcher auto-resolves TikTok identity (tikSelectedProfile) and enriches ad sets with Smart+ campaign type. Videos are uploaded to TikTok automatically from any URL.

POST/v1/launch

Set adAccountType to 'tiktok' — the launcher auto-detects Smart+ vs manual campaigns.

TikTok identity (tikSelectedProfile) is auto-resolved from the TikTok API if not provided.

Videos are uploaded to TikTok from any URL (media.admanage.ai, Google Drive, Dropbox, etc.).

Smart+ (UPGRADED_SMART_PLUS) campaigns are fully supported — videos are combined automatically.

Catalog ad groups may reject certain CTAs (LEARN_MORE). Use SHOP_NOW for catalog campaigns.

Poll GET /v1/batch-status/{adBatchId} to track progress.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "TikTok API Ad",      "adAccountId": "7486153503963054097",      "adAccountType": "tiktok",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "Try it today",      "description": "Launch ads faster with AdManage",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "adSets": [        {          "value": "1859479128199217",          "label": "testgroup manual sales"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "TikTok API Ad",
      "adAccountId": "7486153503963054097",
      "adAccountType": "tiktok",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "Try it today",
      "description": "Launch ads faster with AdManage",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "adSets": [
        {
          "value": "1859479128199217",
          "label": "testgroup manual sales"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Snapchat

#

Snapchat groups launch plus the dedicated campaign, ad squad, and ad management APIs in a single section.

Reporting

Partial Public API
Dashboard:/manage

Snapchat now has documented manage endpoints for campaigns, ad squads, and ads, plus cross-account daily spend. Use the manage endpoints for entity-level reads.

Public Endpoints
/v1/manage/snapchat/campaigns/v1/manage/snapchat/adsquads/v1/manage/snapchat/ads/v1/spend/daily
Docs Shortcuts

Snapchat daily spend trend

Snapchat/data/cost

Use this for cross-account Snapchat spend trends. For entity tables, use the Snapchat manage endpoints.

Public API:/v1/spend/daily
curl -sS "https://api.admanage.ai/v1/spend/daily?startDate=2026-03-01&endDate=2026-03-31&accountIds=b975c7e6-7e3a-477f-b6c9-9e83b73e8109&platform=snapchat" \
  -H "Authorization: Bearer YOUR_API_KEY"

If you need campaigns, ad squads, or ads instead of account-level spend, use GET /v1/manage/snapchat/campaigns, /adsquads, or /ads.

Launching

Launch Snapchat ads through the shared launch surface.

Launch Snapchat Ads

#

Launch Snapchat ads via the API. `snapchatProfileId` is required, `snapchatBrandName` is optional, and the platform supports WEB_VIEW, APP_INSTALL, SNAP_AD, COLLECTION, DEEP_LINK, and STORY launches.

POST/v1/launch

Required on every Snapchat ad: `snapchatProfileId` and at least one Snapchat ad squad in `adSets`. `snapchatBrandName` is optional, and `snapchatProfile` is optional helper metadata.

Supported `snapchatAdType` values: `WEB_VIEW` (default), `APP_INSTALL`, `SNAP_AD`, `COLLECTION`, `DEEP_LINK`, and `STORY`.

`WEB_VIEW` and `SNAP_AD` require a landing page `link`. `APP_INSTALL` and `DEEP_LINK` require app IDs plus `snapchatIconMediaId` or `snapchatIconUrl`. `DEEP_LINK` also requires `snapchatDeepLinkUri`.

`STORY` requires `snapchatStoryChildAdType`, `snapchatStoryPreviewHeadline`, and either `snapchatStoryPreviewMediaId` or `snapchatStoryPreviewUrl`, plus 1-20 `media` items ordered as Story cards.

Story cards can be images or videos. The quickstart example uses image cards because they are the simplest path to a valid Story launch.

To launch from scratch, first create a Snapchat campaign and ad squad: `POST /v1/manage/snapchat/create-campaign` then `POST /v1/manage/snapchat/create-adsquad`.

`snapchatCTA`: `MORE`, `INSTALL_NOW`, `WATCH`, `VIEW`, `APPLY_NOW`, `SHOP_NOW`, etc.

Ad squad IDs use UUID format (e.g., '47c07634-20be-4a4b-99a0-ea98e1bd12a0').

Supports both images and videos. Single-image launches are auto-resized to 1080x1920 where possible.

Poll `GET /v1/batch-status/{adBatchId}` to track progress after the launch request returns.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Snapchat Story API Ad",      "adAccountId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",      "adAccountType": "snapchat",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "Tap into the drop",      "description": "Swipe up to shop the new release.",      "cta": "SHOP_NOW",      "link": "https://admanage.ai/",      "snapchatProfileId": "f7d4c656-25a5-4884-af6a-d9ee9721f920",      "snapchatAdType": "STORY",      "snapchatStoryChildAdType": "WEB_VIEW",      "snapchatStoryPreviewHeadline": "Shop The Latest Drop",      "snapchatStoryPreviewUrl": "https://media.admanage.ai/admanage.ai/1775585047722-c4d8bca8-988a-4ae8-a4c8-2a8084af9a65.jpeg",      "snapchatHeadline": "Tap into the drop",      "snapchatCTA": "SHOP_NOW",      "adSets": [        {          "value": "47c07634-20be-4a4b-99a0-ea98e1bd12a0",          "label": "Landing Page Views"        }      ],      "media": [        {          "url": "https://media.admanage.ai/catalyst-growth.com/retirement-ready-test-output-916-plan.png"        },        {          "url": "https://media.admanage.ai/catalyst-growth.com/retirement-ready-test-output-916-plan.png"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Snapchat Story API Ad",
      "adAccountId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",
      "adAccountType": "snapchat",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "Tap into the drop",
      "description": "Swipe up to shop the new release.",
      "cta": "SHOP_NOW",
      "link": "https://admanage.ai/",
      "snapchatProfileId": "f7d4c656-25a5-4884-af6a-d9ee9721f920",
      "snapchatAdType": "STORY",
      "snapchatStoryChildAdType": "WEB_VIEW",
      "snapchatStoryPreviewHeadline": "Shop The Latest Drop",
      "snapchatStoryPreviewUrl": "https://media.admanage.ai/admanage.ai/1775585047722-c4d8bca8-988a-4ae8-a4c8-2a8084af9a65.jpeg",
      "snapchatHeadline": "Tap into the drop",
      "snapchatCTA": "SHOP_NOW",
      "adSets": [
        {
          "value": "47c07634-20be-4a4b-99a0-ea98e1bd12a0",
          "label": "Landing Page Views"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/catalyst-growth.com/retirement-ready-test-output-916-plan.png"
        },
        {
          "url": "https://media.admanage.ai/catalyst-growth.com/retirement-ready-test-output-916-plan.png"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Managing

Create and read Snapchat campaigns, ad squads, and ads from the Snapchat manage surface.

Create Snapchat Campaign

#

Create a Snapchat campaign before launching ads. Supports objective, budget caps, `objective_v2_properties`, and `measurement_spec` pass-through for app and Story setups.

POST/v1/manage/snapchat/create-campaign

`businessId` is the Snapchat ad account ID.

`workspaceId` is optional but recommended when your company has multiple connected Snapchat workspaces.

If omitted, `status` defaults to `PAUSED`, `objective` defaults to `BRAND_AWARENESS`, `buyModel` defaults to `AUCTION`, and `startTime` defaults to the current time.

Use `measurementSpec` for app-based campaigns, especially `APP_INSTALL`, `APP_CONVERSION`, and Story flows that swipe to app installs or deep links.

Advanced fields pass through directly when provided: `objectiveV2Properties`, `regulations`, `mobileAppProperties`, and `sharedProperties`.

Create an ad squad next with `POST /v1/manage/snapchat/create-adsquad`, then launch creatives with `POST /v1/launch`.

curl https://api.admanage.ai/v1/manage/snapchat/create-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",  "name": "Snap Story Campaign",  "status": "PAUSED",  "objective": "PROMOTE_STORIES",  "startTime": "2026-04-11T09:00:00.000Z",  "dailyBudgetMicro": 25000000}'

Request Body

{
  "businessId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "name": "Snap Story Campaign",
  "status": "PAUSED",
  "objective": "PROMOTE_STORIES",
  "startTime": "2026-04-11T09:00:00.000Z",
  "dailyBudgetMicro": 25000000
}

Response

{
  "success": true,
  "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",
  "campaign": {
    "id": "46fb184a-d371-49f0-8384-ea533cef217a",
    "name": "Snap Story Campaign",
    "status": "PAUSED",
    "objective": "PROMOTE_STORIES",
    "start_time": "2026-04-11T09:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Create Snapchat Ad Squad

#

Create a Snapchat ad squad under an existing campaign. The API can default targeting to US broad and placement to automatic, so you can provision launch-ready ad squads directly from the API.

POST/v1/manage/snapchat/create-adsquad

Required: `businessId`, `campaignId`, `name`, `optimizationGoal`, and one of `dailyBudgetMicro` or `lifetimeBudgetMicro`.

`workspaceId` is optional but recommended when your company has multiple connected Snapchat workspaces.

Defaults: `status=PAUSED`, `type=SNAP_ADS`, `billingEvent=IMPRESSION`, `bidStrategy=AUTO_BID`, `placementV2={ config: "AUTOMATIC" }`, and targeting defaults to US broad 18+ if omitted.

Set `childAdType` to match the ad type you plan to launch later: `REMOTE_WEBPAGE`, `APP_INSTALL`, `DEEP_LINK`, `STORY`, `SNAP_AD`, `COLLECTION`, etc.

For `LOWEST_COST_WITH_MAX_BID` and `TARGET_COST`, send `bidMicro`. For `MIN_ROAS`, send `roasValueMicro`.

Use `storyAdCreativeType` only when configuring Dynamic Story Ads. Standard Story launches can still use `childAdType: STORY` and then `snapchatAdType: STORY` on `/v1/launch`.

After the ad squad is created, use its UUID in the `adSets` array when calling `POST /v1/launch`.

curl https://api.admanage.ai/v1/manage/snapchat/create-adsquad \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",  "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",  "name": "Snap Story Ad Squad",  "status": "PAUSED",  "childAdType": "STORY",  "optimizationGoal": "STORY_OPENS",  "dailyBudgetMicro": 15000000,  "bidStrategy": "AUTO_BID",  "storyAdCreativeType": "WEB_VIEW",  "targeting": {    "regulated_content": false,    "geos": [      {        "country_code": "us"      }    ]  }}'

Request Body

{
  "businessId": "b975c7e6-7e3a-477f-b6c9-9e83b73e8109",
  "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
  "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",
  "name": "Snap Story Ad Squad",
  "status": "PAUSED",
  "childAdType": "STORY",
  "optimizationGoal": "STORY_OPENS",
  "dailyBudgetMicro": 15000000,
  "bidStrategy": "AUTO_BID",
  "storyAdCreativeType": "WEB_VIEW",
  "targeting": {
    "regulated_content": false,
    "geos": [
      {
        "country_code": "us"
      }
    ]
  }
}

Response

{
  "success": true,
  "adsquadId": "7b99bd80-5279-41c1-9d8d-e28875d7e7dd",
  "adsquad": {
    "id": "7b99bd80-5279-41c1-9d8d-e28875d7e7dd",
    "campaign_id": "46fb184a-d371-49f0-8384-ea533cef217a",
    "name": "Snap Story Ad Squad",
    "status": "PAUSED",
    "optimization_goal": "STORY_OPENS",
    "child_ad_type": "STORY"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Snapchat Campaigns

#

Fetch Snapchat campaigns for one ad account with spend over the last 90 days. This is the public manage/reporting surface behind the Snapchat campaigns table in /manage.

GET/v1/manage/snapchat/campaigns

Query Parameters

?businessId=b975c7e6-7e3a-477f-b6c9-9e83b73e8109&page=1&pageSize=20

Required: `businessId` (Snapchat ad account UUID).

Optional pagination: `page` and `pageSize`.

Spend is computed from Snapchat stats over the last 90 days and returned in USD.

Use this when you want Snapchat campaign rows rather than the cross-platform spend chart from `GET /v1/spend/daily`.

curl https://api.admanage.ai/v1/manage/snapchat/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",
      "campaignName": "Snap Story Campaign",
      "status": "PAUSED",
      "spend": 382.14,
      "objective": "PROMOTE_STORIES",
      "budget": 25,
      "currency": "USD",
      "createdTime": "2026-04-01T09:00:00.000Z",
      "startTime": "2026-04-02T00:00:00.000Z",
      "endTime": null
    }
  ],
  "totalCount": 12,
  "page": 1,
  "pageSize": 20
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Snapchat Ad Squads

#

Fetch Snapchat ad squads for one ad account, optionally filtered to specific campaigns. Ad squads are the Snapchat equivalent of ad sets.

GET/v1/manage/snapchat/adsquads

Query Parameters

?businessId=b975c7e6-7e3a-477f-b6c9-9e83b73e8109&page=1&pageSize=20&campaignIds=%5B%2246fb184a-d371-49f0-8384-ea533cef217a%22%5D

Required: `businessId` (Snapchat ad account UUID).

Optional: `campaignIds` as a JSON array string when you want ad squads for only a subset of campaigns.

Spend is computed from Snapchat stats over the last 90 days.

Use ad squad IDs from this response in the `adSets` array when calling `POST /v1/launch` for Snapchat.

curl https://api.admanage.ai/v1/manage/snapchat/adsquads \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "adsquadId": "7b99bd80-5279-41c1-9d8d-e28875d7e7dd",
      "adsquadName": "Snap Story Ad Squad",
      "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",
      "campaignName": "Snap Story Campaign",
      "status": "PAUSED",
      "spend": 181.24,
      "optimizationGoal": "STORY_OPENS",
      "billingEvent": "IMPRESSION",
      "budget": 15,
      "currency": "USD",
      "createdTime": "2026-04-02T09:30:00.000Z"
    }
  ],
  "totalCount": 4,
  "page": 1,
  "pageSize": 20
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Snapchat Ads

#

Fetch Snapchat ads for one ad account with spend and creative preview thumbnails. Optionally filter to specific ad squads.

GET/v1/manage/snapchat/ads

Query Parameters

?businessId=b975c7e6-7e3a-477f-b6c9-9e83b73e8109&page=1&pageSize=20&adsquadIds=%5B%227b99bd80-5279-41c1-9d8d-e28875d7e7dd%22%5D

Required: `businessId` (Snapchat ad account UUID).

Optional: `adsquadIds` as a JSON array string when you want ads for only a subset of ad squads.

Spend is computed from Snapchat stats over the last 90 days.

The API resolves creative preview URLs where possible so the response can drive thumbnail-heavy manage views.

curl https://api.admanage.ai/v1/manage/snapchat/ads \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "adId": "2f54f5e0-0e98-4c54-8b1b-8cb2ef3f11b4",
      "adName": "Snap Story Card 01",
      "adsquadId": "7b99bd80-5279-41c1-9d8d-e28875d7e7dd",
      "adsquadName": "Snap Story Ad Squad",
      "campaignId": "46fb184a-d371-49f0-8384-ea533cef217a",
      "campaignName": "Snap Story Campaign",
      "status": "ACTIVE",
      "spend": 94.52,
      "currency": "USD",
      "createdTime": "2026-04-02T09:45:00.000Z",
      "thumbnailUrl": "https://adsapi.snapchat.com/media-preview/example.jpeg"
    }
  ],
  "totalCount": 7,
  "page": 1,
  "pageSize": 20
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Pinterest

#

Pinterest keeps launch docs here and maps reporting to the shared query and spend APIs in the reporting panel.

Reporting

Partial Public API
Dashboard:/manage/reports

Pinterest performance tables use the shared Query Reports endpoint. There is no dedicated Pinterest top-ads public endpoint in v1 yet.

Public Endpoints
/v1/reports/query/v1/spend/daily
Docs Shortcuts

Pinterest campaign performance table

Pinterest/reports

Pinterest performance tables use the shared Query Reports endpoint.

Public API:/v1/reports/query
curl -sS "https://api.admanage.ai/v1/reports/query?accountIds=5491002233445&startDate=2026-03-01&endDate=2026-03-31&metrics=spend,impressions,clicks,ctr,cpc&groupBy=campaignName&sortBy=spend&sortDirection=DESC&limit=25" \
  -H "Authorization: Bearer YOUR_API_KEY"

Launching

Launch promoted pins and Pinterest campaigns.

Launch Pinterest Ads

#

Launch Pinterest ads via the API. Board ID is optional — if not provided or not writable, a new board is auto-created. Supports both image and video pins.

POST/v1/launch

pinterestBoardId is optional. If not provided or not writable, a new board is auto-created under your Pinterest account.

Supports both image URLs (.jpg, .png) and video URLs (.mp4). Images launch much faster.

pinterestCTA: 'LEARN_MORE', 'SHOP_NOW', 'SIGN_UP', etc.

CATALOG_SALES campaign objectives use 'SHOPPING' creative type automatically.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Pinterest API Ad",      "adAccountId": "549769890977",      "adAccountType": "pinterest",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "Pin title",      "description": "Pin description",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "pinterestBoardId": "879820545894149277",      "adSets": [        {          "value": "2680088752234",          "label": "Ad group copy"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/234234ad_932200713WBIit8kT.jpg"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Pinterest API Ad",
      "adAccountId": "549769890977",
      "adAccountType": "pinterest",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "Pin title",
      "description": "Pin description",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "pinterestBoardId": "879820545894149277",
      "adSets": [
        {
          "value": "2680088752234",
          "label": "Ad group copy"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/234234ad_932200713WBIit8kT.jpg"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Google Ads

#

Google Ads has its own dedicated manage and reporting surface rather than using the shared reports API.

Reporting

Partial Public API
Dashboard:/googleAds

Google Ads reporting is channel-specific. Use the Google Ads endpoints instead of the shared Query Reports endpoint.

Public Endpoints
/v1/google-ads/campaigns
Docs Shortcuts

Google Ads campaign + ad group metrics

Google Ads/googleAds

Google Ads reporting is channel-specific: use the Google Ads campaigns endpoint, not /v1/reports/query.

Public API:/v1/google-ads/campaigns
curl -sS "https://api.admanage.ai/v1/google-ads/campaigns?accountId=7037703309" \
  -H "Authorization: Bearer YOUR_API_KEY"

Managing & Reporting

List, duplicate, edit, and launch Google Ads campaigns, ad groups, ads, and assets.

List Google Ads Campaigns

#

Fetch cached Google Ads campaigns and ad groups from the database. Returns campaign structure with spend, impressions, clicks, conversions, and nested ad groups. This is the public reporting surface for Google Ads campaign and ad group metrics, rather than GET /v1/reports/query.

GET/v1/google-ads/campaigns

Query Parameters

?accountId=7037703309

accountId (required): Google Ads account ID.

Data is cached — use for instant reads. Sync happens automatically.

Use this endpoint for Google Ads reporting questions. The shared GET /v1/reports/query endpoint is not the Google Ads reporting surface.

curl https://api.admanage.ai/v1/google-ads/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": 123456789,
      "name": "PMax - Q1 Prospecting",
      "status": "ENABLED",
      "budget": "10000000",
      "amount_spent": "234.56",
      "impressions": "5000",
      "clicks": "120",
      "conversions": "15",
      "ad_groups": [
        {
          "id": 987654321,
          "name": "Ad Group 1",
          "status": "ENABLED",
          "amount_spent": "150.25",
          "impressions": "3000",
          "clicks": "80",
          "conversions": "10"
        }
      ]
    }
  ],
  "cached": true,
  "lastSynced": "2026-03-30T10:15:00.000Z",
  "stale": false
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Toggle Campaign Status

#

Toggle a Google Ads campaign status between ENABLED and PAUSED.

POST/v1/google-ads/campaigns/toggle-status

status: 'ENABLED' or 'PAUSED'.

curl https://api.admanage.ai/v1/google-ads/campaigns/toggle-status \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "campaignId": "123456789",  "status": "PAUSED"}'

Request Body

{
  "accountId": "7037703309",
  "campaignId": "123456789",
  "status": "PAUSED"
}

Response

{
  "success": true,
  "campaignId": "123456789",
  "status": "PAUSED"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Rename Campaign

#

Rename a Google Ads campaign.

POST/v1/google-ads/campaigns/rename
curl https://api.admanage.ai/v1/google-ads/campaigns/rename \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "campaignId": "123456789",  "newName": "PMax - Q2 Prospecting"}'

Request Body

{
  "accountId": "7037703309",
  "campaignId": "123456789",
  "newName": "PMax - Q2 Prospecting"
}

Response

{
  "success": true,
  "campaignId": "123456789",
  "newName": "PMax - Q2 Prospecting"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Campaign

#

Duplicate a Google Ads campaign with all ad groups, ads, and keywords.

POST/v1/google-ads/duplicate-campaign

Copies all child ad groups, ads, and keywords.

status: 'ENABLED' or 'PAUSED'.

curl https://api.admanage.ai/v1/google-ads/duplicate-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "123456789",  "accountId": "7037703309",  "newName": "Copy of PMax Campaign",  "status": "PAUSED"}'

Request Body

{
  "campaignId": "123456789",
  "accountId": "7037703309",
  "newName": "Copy of PMax Campaign",
  "status": "PAUSED"
}

Response

{
  "success": true,
  "newCampaignId": "987654321",
  "newCampaignName": "Copy of PMax Campaign",
  "adGroupsCopied": 5,
  "totalAdGroups": 5,
  "totalAdsCopied": 25,
  "totalKeywordsCopied": 150
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Ad Group

#

Duplicate a Google Ads ad group with all ads and keywords.

POST/v1/google-ads/duplicate-ad-group
curl https://api.admanage.ai/v1/google-ads/duplicate-ad-group \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "123456789",  "adGroupId": "987654321",  "accountId": "7037703309",  "newName": "Copy of Ad Group",  "status": "PAUSED"}'

Request Body

{
  "campaignId": "123456789",
  "adGroupId": "987654321",
  "accountId": "7037703309",
  "newName": "Copy of Ad Group",
  "status": "PAUSED"
}

Response

{
  "success": true,
  "newAdGroupId": "555666777",
  "newAdGroupName": "Copy of Ad Group",
  "adsCopied": 10,
  "keywordsCopied": 45
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate Ad

#

Duplicate a single Google Ads ad (RSA, RDA, or generic types).

POST/v1/google-ads/duplicate-ad

Supports RSA, RDA, and generic ad types.

curl https://api.admanage.ai/v1/google-ads/duplicate-ad \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adGroupId": "987654321",  "adId": "111222333",  "accountId": "7037703309",  "status": "PAUSED"}'

Request Body

{
  "adGroupId": "987654321",
  "adId": "111222333",
  "accountId": "7037703309",
  "status": "PAUSED"
}

Response

{
  "success": true,
  "newAdId": "444555666",
  "adType": "RESPONSIVE_SEARCH_AD"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Ad Details

#

Fetch a Demand Gen ad's creative data for draft duplication. Returns headlines, descriptions, logos, videos, and CTAs.

POST/v1/google-ads/ad-details

Read-only endpoint despite using POST method.

curl https://api.admanage.ai/v1/google-ads/ad-details \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "adGroupId": "987654321",  "adId": "111222333"}'

Request Body

{
  "accountId": "7037703309",
  "adGroupId": "987654321",
  "adId": "111222333"
}

Response

{
  "success": true,
  "adType": "DEMAND_GEN_VIDEO_RESPONSIVE_AD",
  "adName": "My Ad Name",
  "sourceCreative": {
    "headlines": [
      {
        "text": "Headline 1"
      }
    ],
    "descriptions": [
      {
        "text": "Description text"
      }
    ],
    "businessName": {
      "text": "My Business"
    },
    "callToActions": [
      {
        "label": "Shop Now"
      }
    ],
    "finalUrls": [
      "https://example.com"
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Add Text Assets

#

Add text assets (headlines, long headlines, descriptions) to Performance Max asset groups.

POST/v1/google-ads/add-text-assets

All text arrays are optional but at least one must be provided.

curl https://api.admanage.ai/v1/google-ads/add-text-assets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "assetGroupIds": [    "customers/7037703309/assetGroups/123456"  ],  "headlines": [    "Shop Our Sale",    "Free Shipping Today"  ],  "longHeadlines": [    "Discover the best deals on premium products"  ],  "descriptions": [    "Get 50% off all items. Limited time offer."  ]}'

Request Body

{
  "accountId": "7037703309",
  "assetGroupIds": [
    "customers/7037703309/assetGroups/123456"
  ],
  "headlines": [
    "Shop Our Sale",
    "Free Shipping Today"
  ],
  "longHeadlines": [
    "Discover the best deals on premium products"
  ],
  "descriptions": [
    "Get 50% off all items. Limited time offer."
  ]
}

Response

{
  "success": true,
  "message": "Added 4 text asset link(s)",
  "results": [
    {
      "type": "headline",
      "text": "Shop Our Sale",
      "assetGroupId": "customers/7037703309/assetGroups/123456",
      "success": true
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Add Video/Image Assets

#

Add video or image assets to PMax asset groups or Demand Gen campaign ads. Rate limited: 5 requests/minute.

POST/v1/google-ads/add-assets

For PMax: pass assetGroupIds. For Demand Gen: pass campaignId + selectedAdIds.

Videos use youtubeVideoId. Images use base64 + fieldType + aspectRatio.

Rate limited: 5 requests per minute.

curl https://api.admanage.ai/v1/google-ads/add-assets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "assetGroupIds": [    "customers/7037703309/assetGroups/123456"  ],  "videos": [    {      "youtubeVideoId": "dQw4w9WgXcQ"    }  ]}'

Request Body

{
  "accountId": "7037703309",
  "assetGroupIds": [
    "customers/7037703309/assetGroups/123456"
  ],
  "videos": [
    {
      "youtubeVideoId": "dQw4w9WgXcQ"
    }
  ]
}

Response

{
  "success": true,
  "message": "Added 1 asset(s)",
  "results": [
    {
      "videoId": "dQw4w9WgXcQ",
      "assetGroup": "customers/7037703309/assetGroups/123456",
      "success": true
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Remove Asset

#

Remove an asset from a PMax asset group.

POST/v1/google-ads/remove-assets

PMax campaigns require a minimum number of assets per type — removal may fail if at the minimum.

curl https://api.admanage.ai/v1/google-ads/remove-assets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "assetId": "12345678",  "assetGroupId": "customers/7037703309/assetGroups/123456"}'

Request Body

{
  "accountId": "7037703309",
  "assetId": "12345678",
  "assetGroupId": "customers/7037703309/assetGroups/123456"
}

Response

{
  "success": true,
  "message": "Asset removed successfully"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Assets

#

Update text assets in PMax asset groups or Demand Gen ads. Text assets are immutable in Google Ads — the old asset is removed and a new one is created.

POST/v1/google-ads/update-assets

Text assets are immutable — updates delete the old and create a new one.

curl https://api.admanage.ai/v1/google-ads/update-assets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "editedAssets": [    {      "assetId": "12345678",      "text": "New Headline Text",      "originalText": "Old Headline Text",      "type": "headline",      "assetGroupId": "customers/7037703309/assetGroups/123456"    }  ]}'

Request Body

{
  "accountId": "7037703309",
  "editedAssets": [
    {
      "assetId": "12345678",
      "text": "New Headline Text",
      "originalText": "Old Headline Text",
      "type": "headline",
      "assetGroupId": "customers/7037703309/assetGroups/123456"
    }
  ]
}

Response

{
  "success": true,
  "message": "Updated 1 asset(s)",
  "results": [
    {
      "assetId": "12345678",
      "type": "headline",
      "success": true,
      "oldText": "Old Headline Text",
      "newText": "New Headline Text"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch (Google Ads)

#

Orchestrated launch — creates a batch, runs all asset operations (add/remove/update text, videos, images), and updates the batch. Returns 202 Accepted. Rate limited: 3 requests/minute.

POST/v1/google-ads/launch

Returns 202 Accepted — track progress via GET /v1/batch-status/:batchId.

Rate limited: 3 requests per minute.

Supports PMax (assetGroupIds) and Demand Gen (campaignId + selectedAdIds) campaigns.

curl https://api.admanage.ai/v1/google-ads/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "7037703309",  "accountName": "My Google Ads Account",  "assetGroupIds": [    "customers/7037703309/assetGroups/123456"  ],  "assetGroupNames": [    "PMax Asset Group 1"  ],  "headlines": [    "Shop Our Sale"  ],  "descriptions": [    "Get 50% off all items"  ],  "videos": [    {      "youtubeVideoId": "dQw4w9WgXcQ"    }  ]}'

Request Body

{
  "accountId": "7037703309",
  "accountName": "My Google Ads Account",
  "assetGroupIds": [
    "customers/7037703309/assetGroups/123456"
  ],
  "assetGroupNames": [
    "PMax Asset Group 1"
  ],
  "headlines": [
    "Shop Our Sale"
  ],
  "descriptions": [
    "Get 50% off all items"
  ],
  "videos": [
    {
      "youtubeVideoId": "dQw4w9WgXcQ"
    }
  ]
}

Response

{
  "success": true,
  "batchId": 12345,
  "slug": "unique-slug-identifier",
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


LinkedIn

LinkedIn

#

LinkedIn groups launch, account discovery, organization posts, duplication, and LinkedIn-specific entity metrics.

Reporting

Partial Public API
Dashboard:/manage/launch

LinkedIn now has a documented launch surface plus a LinkedIn-specific manage endpoint for campaign groups, campaigns, creatives, and optional metrics.

Public Endpoints
/v1/linkedin/manage
Docs Shortcuts

LinkedIn reporting still does not use the shared reports endpoint. Stay on the LinkedIn endpoints for account discovery, organization posts, and entity-level metrics.

LinkedIn campaign performance

LinkedIn/manage

LinkedIn campaign and creative reporting uses the LinkedIn-specific manage endpoint with optional metrics.

Public API:/v1/linkedin/manage
curl -sS "https://api.admanage.ai/v1/linkedin/manage?adAccountId=507667431&type=campaigns&includeMetrics=1&startDate=2026-03-01&endDate=2026-03-31" \
  -H "Authorization: Bearer YOUR_API_KEY"

Use `type=campaignGroups`, `campaigns`, or `creatives` depending on the LinkedIn entity level you need. LinkedIn does not use GET /v1/reports/query.

Launching

Launch LinkedIn ads through the shared launcher.

Launch LinkedIn Ads

#

Launch LinkedIn ads via the shared launch API. Supports single image, video, carousel, and existing-post workflows through LinkedIn-specific fields on each ad object.

POST/v1/launch

Set `adAccountType` to `linkedin` on each ad row.

Use LinkedIn campaign IDs in `adSets`. LinkedIn launches target campaigns rather than Meta-style ad sets.

`linkedinHeadline`, `linkedinDescription`, and `linkedinCTA` override the generic `title`, `description`, and `cta` fields when provided.

`linkedinAdFormat` supports `SINGLE_IMAGE`, `VIDEO`, and `CAROUSEL`.

For carousel launches, provide `carouselCards` with per-card headlines and landing URLs.

For boost-style launches, use `media[].existingPostUrn` from `GET /v1/linkedin/organization-posts`.

`linkedinObjective` supports `BRAND_AWARENESS`, `ENGAGEMENT`, `VIDEO_VIEWS`, `WEBSITE_VISITS`, `WEBSITE_CONVERSIONS`, `LEAD_GENERATION`, and `JOB_APPLICANTS`.

Poll `GET /v1/batch-status/{adBatchId}` to track progress after the launch request returns.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "LinkedIn Website Visits API Ad",      "adAccountId": "507667431",      "adAccountType": "linkedin",      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",      "title": "LinkedIn launch headline",      "description": "Launch LinkedIn creatives and keep campaign workflows in one place.",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "linkedinHeadline": "Scale LinkedIn launches",      "linkedinDescription": "Keep launch, copy, and reporting workflows in one API surface.",      "linkedinCTA": "LEARN_MORE",      "linkedinAdFormat": "SINGLE_IMAGE",      "linkedinObjective": "WEBSITE_VISITS",      "adSets": [        {          "value": "720480604",          "label": "Website Visits - US"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/linkedin-launch-example.png"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "LinkedIn Website Visits API Ad",
      "adAccountId": "507667431",
      "adAccountType": "linkedin",
      "workspaceId": "cmiypwwnf00012m2rhiutlf3f",
      "title": "LinkedIn launch headline",
      "description": "Launch LinkedIn creatives and keep campaign workflows in one place.",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "linkedinHeadline": "Scale LinkedIn launches",
      "linkedinDescription": "Keep launch, copy, and reporting workflows in one API surface.",
      "linkedinCTA": "LEARN_MORE",
      "linkedinAdFormat": "SINGLE_IMAGE",
      "linkedinObjective": "WEBSITE_VISITS",
      "adSets": [
        {
          "value": "720480604",
          "label": "Website Visits - US"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/linkedin-launch-example.png"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Managing

Use LinkedIn-specific endpoints for accounts, campaign groups, campaigns, creatives, and posts.

List LinkedIn Ad Accounts

#

List the connected LinkedIn ad accounts available to the authenticated company, including account status, currency, role, and organization reference.

GET/v1/linkedin/accounts

No query params are required.

Use the returned `id` as `adAccountId` in the LinkedIn manage and duplicate endpoints.

Returns only accounts the connected LinkedIn user can access.

curl https://api.admanage.ai/v1/linkedin/accounts \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "accounts": [
    {
      "id": "507667431",
      "name": "LinkedIn EMEA",
      "status": "ACTIVE",
      "currency": "USD",
      "type": "BUSINESS",
      "role": "ACCOUNT_MANAGER",
      "reference": "urn:li:organization:123456"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Query LinkedIn Campaign Groups, Campaigns, or Creatives

#

Fetch LinkedIn campaign groups, campaigns, or creatives for one ad account. Optional metrics turn this into the public LinkedIn manage/reporting surface for spend, impressions, clicks, CTR, and CPM.

GET/v1/linkedin/manage

Query Parameters

?adAccountId=507667431&type=campaigns&includeMetrics=1&startDate=2026-03-01&endDate=2026-03-31

Required: `adAccountId`.

Optional `type`: `campaignGroups`, `campaigns` (default), or `creatives`.

Set `includeMetrics=1` to attach spend, impressions, clicks, CTR, and CPM from LinkedIn adAnalytics.

Optional `startDate` and `endDate` default to the last 30 days when metrics are requested.

When `type=creatives`, pass `campaignId` to limit results to one campaign and `includeThumbnails=1` to resolve creative preview images.

This endpoint is LinkedIn-specific. Do not use `GET /v1/reports/query` for LinkedIn.

curl https://api.admanage.ai/v1/linkedin/manage \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": "720480604",
      "name": "Website Visits - US",
      "status": "ACTIVE",
      "objectiveType": "WEBSITE_VISITS",
      "type": "SPONSORED_UPDATES",
      "costType": "CPC",
      "campaignGroup": "703344221",
      "campaignGroupName": "Q2 Prospecting",
      "metrics": {
        "spend": 842.22,
        "impressions": 145000,
        "clicks": 3200,
        "ctr": 2.21,
        "cpm": 5.81
      }
    }
  ],
  "total": 1,
  "dateRange": {
    "start": "2026-03-01",
    "end": "2026-03-31"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List LinkedIn Organization Posts

#

Fetch recent organic LinkedIn organization posts for one ad account. Use this to find post URNs for boost-style launches or to populate a post picker in the launch flow.

GET/v1/linkedin/organization-posts

Query Parameters

?adAccountId=507667431&count=25

Required: `adAccountId` (or `businessId`).

Optional `count` defaults to 50 and is capped at 100.

Use `posts[].urn` as `media[].existingPostUrn` when launching existing LinkedIn posts through `POST /v1/launch`.

curl https://api.admanage.ai/v1/linkedin/organization-posts \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "posts": [
    {
      "id": "735233448897",
      "urn": "urn:li:ugcPost:735233448897",
      "commentary": "Q2 product launch post",
      "createdAt": "2026-03-20T10:30:00.000Z",
      "mediaType": "IMAGE",
      "mediaUrl": "urn:li:image:C4D10AQHexample",
      "thumbnailUrl": "https://media.licdn.com/dms/image/example",
      "permalink": "https://www.linkedin.com/feed/update/urn:li:ugcPost:735233448897",
      "likeCount": 42,
      "commentCount": 3,
      "shareCount": 1,
      "impressionCount": 0
    }
  ],
  "source": "rest"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate LinkedIn Campaign Group

#

Duplicate a LinkedIn campaign group. This is the LinkedIn equivalent of duplicating a top-level campaign container before launching or editing child campaigns.

POST/v1/linkedin/duplicate-campaign

Required: `campaignGroupId`, `adAccountId`, and `newName`.

Set `isLive=true` to keep the duplicated campaign group active. Otherwise the API creates it and then pauses it.

The API copies schedule and budget fields from the source campaign group when present.

curl https://api.admanage.ai/v1/linkedin/duplicate-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignGroupId": "703344221",  "adAccountId": "507667431",  "newName": "Q2 Prospecting Copy",  "isLive": false}'

Request Body

{
  "campaignGroupId": "703344221",
  "adAccountId": "507667431",
  "newName": "Q2 Prospecting Copy",
  "isLive": false
}

Response

{
  "success": true,
  "campaignGroupId": "703344998",
  "campaignGroup": {
    "id": "703344998",
    "name": "Q2 Prospecting Copy",
    "status": "PAUSED"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Duplicate LinkedIn Campaign

#

Duplicate a LinkedIn campaign. In LinkedIn's model this is the equivalent of duplicating an ad set-level entity under a campaign group.

POST/v1/linkedin/duplicate-adgroup

Required: `campaignId`, `adAccountId`, and `newName`.

Set `isLive=true` to create the duplicated campaign as active. Otherwise it is created paused.

The API copies the source campaign payload, removes LinkedIn read-only fields, and keeps the original objective and campaign group association.

curl https://api.admanage.ai/v1/linkedin/duplicate-adgroup \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "campaignId": "720480604",  "adAccountId": "507667431",  "newName": "Website Visits - US Copy",  "isLive": false}'

Request Body

{
  "campaignId": "720480604",
  "adAccountId": "507667431",
  "newName": "Website Visits - US Copy",
  "isLive": false
}

Response

{
  "success": true,
  "campaignId": "720480999",
  "campaign": {
    "id": "720480999",
    "name": "Website Visits - US Copy",
    "status": "PAUSED",
    "objectiveType": "WEBSITE_VISITS",
    "campaignGroupId": "703344221"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Axon

Axon

#

Axon/AppLovin groups launch and campaign duplication here, with reporting limitations called out separately.

Reporting

Dashboard Only
Dashboard:/launch

Axon/AppLovin has a public launch path and campaign duplication surface, but reporting is not documented as a public v1 API yet.

Public Endpoints

No documented public reporting endpoints yet.

Docs Shortcuts

Use the Axon launch and manage endpoints for workflow automation. Reporting remains outside the public v1 surface today.

No copy-paste reporting example is published for this channel yet. Use the endpoint shortcuts above to jump to the relevant API docs.

Launching

Launch Axon/AppLovin campaigns through the shared launch surface.

Launch Axon/AppLovin Ads

#

Launch Axon (AppLovin) ads via the API. Pass campaigns as adSets (they are converted to axonSelectedCampaigns). Requires end cards (axonEndCards) and 9:16 video.

POST/v1/launch

adSets are converted to axonSelectedCampaigns (Axon uses campaigns, not ad sets).

axonEndCards required: array of { assetId, name, type } objects. Must be pre-uploaded endcard asset IDs.

Videos must be 9:16 aspect ratio (1080x1920). Videos are auto-detected and conversion is attempted if needed.

Asset approval on Axon can take 30-60 seconds after upload.

link is required — this is the creative set landing page URL.

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Axon API Ad",      "adAccountId": "950967007",      "adAccountType": "axon",      "workspaceId": "cmhrv27io0001s4r4ouftfoly",      "title": "Axon ad title",      "description": "Axon ad description",      "cta": "LEARN_MORE",      "link": "https://admanage.ai/",      "axonEndCards": [        {          "assetId": "26503831",          "name": "endcard.jpg",          "type": "image"        }      ],      "adSets": [        {          "value": "1781008",          "label": "0/day US - ROAS"        }      ],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Axon API Ad",
      "adAccountId": "950967007",
      "adAccountType": "axon",
      "workspaceId": "cmhrv27io0001s4r4ouftfoly",
      "title": "Axon ad title",
      "description": "Axon ad description",
      "cta": "LEARN_MORE",
      "link": "https://admanage.ai/",
      "axonEndCards": [
        {
          "assetId": "26503831",
          "name": "endcard.jpg",
          "type": "image"
        }
      ],
      "adSets": [
        {
          "value": "1781008",
          "label": "0/day US - ROAS"
        }
      ],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/ERER_DE_red123D4kWzVhn.mp4"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Managing

Duplicate Axon/AppLovin campaigns through the public Axon manage API.

Duplicate Axon Campaign

#

Duplicate an Axon/AppLovin campaign through the public Axon manage API. Preserves campaign targeting, goals, and app-tracking settings.

POST/v1/manage/axon/duplicate-campaign

This endpoint duplicates through Axon's public `campaign/create` API, not the dashboard admin action.

APP campaigns preserve `tracking`, `platform`, `package_name`, and composite banner settings from the source campaign.

Axon currently rejects low APP create budgets. If the source budget is below Axon's minimum, the API raises the create budget and returns a warning.

When `status` is `PAUSED`, the API performs a follow-up Axon `campaign/update` call because Axon create can ignore paused state on APP campaigns.

curl https://api.admanage.ai/v1/manage/axon/duplicate-campaign \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "businessId": "1159321785",  "sourceCampaignId": "1786048",  "newCampaignName": "Campaign copy via API",  "status": "PAUSED",  "startDate": "2026-04-08T19:39:00",  "workspaceId": "workspace_abc"}'

Request Body

{
  "businessId": "1159321785",
  "sourceCampaignId": "1786048",
  "newCampaignName": "Campaign copy via API",
  "status": "PAUSED",
  "startDate": "2026-04-08T19:39:00",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "campaignId": "1919062",
  "campaign": {
    "id": "1919062",
    "name": "Campaign copy via API",
    "status": "PAUSED",
    "type": "APP"
  },
  "warnings": [
    {
      "code": "AXON_APP_MIN_BUDGET_APPLIED",
      "message": "Axon APP campaigns require a minimum create budget of 500. Increased the create budget during duplication."
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


AdScan

#

AdScan procedures are exposed through an AdManage compatibility wrapper, so boards, saved ads, Brand Spy, notifications, and other AdScan flows can be called with the same AdManage API key.

Compatibility Layer

Use the generic AdScan query and mutation wrappers to reach any documented AdScan tRPC procedure.

Search AdScan Saved Ads By Spend

#

Search saved AdScan ads with a spend-style filter. AdManage accepts spend/spendMin/spendMax and converts them to AdScan's viewsMin/viewsMax using a fixed $13 CPM assumption.

GET/v1/adscan/trpc/ads.list

Query Parameters

?input=%7B%22searchQuery%22%3A%22crypto%22%2C%22spendMin%22%3A260%2C%22spendMax%22%3A520%2C%22limit%22%3A10%7D

This is a convenience wrapper over AdScan ads.list.

spend and spendMin are treated as minimum estimated spend in USD.

spendMax is treated as maximum estimated spend in USD.

Conversion uses a fixed $13 CPM assumption: views = spend * 1000 / 13.

You can combine spend filtering with searchQuery, boardId, cursor, and limit.

curl https://api.admanage.ai/v1/adscan/trpc/ads.list \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "result": {
    "data": {
      "ads": [
        {
          "id": 634033,
          "advertiser": {
            "name": "Metrotile UK Ltd"
          },
          "cards": [
            {
              "title": "Europe’s Number One Lightweight Steel Roofing System"
            }
          ],
          "engagement": {
            "reach": 21166
          }
        }
      ],
      "hasMore": true,
      "nextCursor": 634032
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Scrape Meta Ads Library URL

#

Enqueue a scrape of a Meta Ads Library URL (or any advertiser search input). Returns a jobId immediately; poll GET /v1/adscan/scrape/{jobId} until status is 'success' or 'failed'.

POST/v1/adscan/scrape

Pass { url } as shorthand — the URL must include a numeric view_all_page_id query param.

Or pass the full shape: { mode: 'url' | 'search' | 'advertiserId', input, country?, priority?, maxAds? }.

country defaults to 'GB' and accepts 'US' or 'GB'. For URL mode, a country=... query param in the URL overrides the body value.

priority accepts 'urgent' | 'high' | 'normal' and defaults to 'urgent' — scrapes submitted through this endpoint jump the queue ahead of UI-initiated high-priority jobs.

maxAds caps the scrape at N ads (range 1–1000, default 100). Smaller caps finish much faster — raise it when the user asks for exhaustive coverage.

deduped=true means a queued job for this advertiser/country already exists and was returned instead of creating a new one.

Available to any authenticated AdManage / AdScan Pro user with an API key. Scrapes typically take seconds to a few minutes depending on ad count.

Rate limit: 20 scrapes per 24 hours per user. The response includes a rateLimit object with scrapesUsed, scrapesPerDay, and scrapesRemaining. When exceeded, the endpoint returns 429 TOO_MANY_REQUESTS.

curl https://api.admanage.ai/v1/adscan/scrape \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "url": "https://www.facebook.com/ads/library/?view_all_page_id=123456789&country=US"}'

Request Body

{
  "url": "https://www.facebook.com/ads/library/?view_all_page_id=123456789&country=US"
}

Response

{
  "result": {
    "data": {
      "jobId": "cltx5zq9p0000abcdef12345",
      "deduped": false,
      "advertiserId": 987,
      "advertiserName": "Example Brand",
      "pageId": "123456789",
      "country": "US",
      "rateLimit": {
        "scrapesUsed": 3,
        "scrapesPerDay": 20,
        "scrapesRemaining": 17
      }
    }
  }
}

Additional Examples

Search by advertiser name
Request Body
{
  "mode": "search",
  "input": "Nike",
  "country": "GB"
}
Scrape by advertiser ID
Request Body
{
  "mode": "advertiserId",
  "input": "987"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get AdScan Scrape Job Status

#

Look up the status of a scrape job enqueued via POST /v1/adscan/scrape. Poll this endpoint until isTerminal is true, then fetch the resulting ads via /v1/adscan/trpc/ads.list filtered by advertiserId.

GET/v1/adscan/scrape/{jobId}

status values: 'queued' → 'running' → 'success' or 'failed'. isTerminal is true for 'success' and 'failed'.

When status is 'success', use GET /v1/adscan/trpc/ads.list with input filter { advertiserId } to fetch the scraped ads.

errorMessage is populated when status is 'failed'. Job may retry automatically up to maxRetries times.

Available to any authenticated AdManage / AdScan Pro user with an API key.

curl https://api.admanage.ai/v1/adscan/scrape/{jobId} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "result": {
    "data": {
      "jobId": "cltx5zq9p0000abcdef12345",
      "status": "success",
      "isTerminal": true,
      "advertiserId": 987,
      "advertiserName": "Example Brand",
      "country": "US",
      "trigger": "manual",
      "priority": "high",
      "scheduledAt": "2026-04-21T15:00:00.000Z",
      "startedAt": "2026-04-21T15:00:08.000Z",
      "finishedAt": "2026-04-21T15:00:42.000Z",
      "durationMs": 34000,
      "itemsScraped": 147,
      "companiesFound": 1,
      "totalReach": 5120000,
      "errorMessage": null,
      "retryCount": 0,
      "maxRetries": 3,
      "proxyUsed": "evomi",
      "note": "manual:url:https://www.facebook.com/ads/library/?view_all_page_id=123456789",
      "resultData": null,
      "createdAt": "2026-04-21T15:00:00.000Z",
      "updatedAt": "2026-04-21T15:00:42.000Z"
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


AdScan Query Wrapper

#

Proxy any AdScan tRPC query through AdManage using your AdManage API key. Replace {procedure} with a read procedure such as boards.list, ads.list, ads.getDetails, brandSpy.getOverview, or brandSpy.listTopAdvertisers.

GET/v1/adscan/trpc/{procedure}

Query Parameters

?input=%7B%22searchQuery%22%3A%22crypto%22%2C%22spendMin%22%3A260%2C%22limit%22%3A5%7D

This wrapper preserves AdScan's native response shape, so existing AdScan clients can consume it with minimal changes.

Use GET with an URL-encoded input query param exactly like AdScan's public tRPC API.

Common read procedures: boards.list, ads.list, ads.getDetails, ads.listTopCompanies, brandSpy.getOverview, brandSpy.getAdCopies, brandSpy.getLandingPages, brandSpy.getTimeline, brandSpy.getScrapeJob, notifications.list, teams.list.

The wrapper injects the authenticated AdManage user's email upstream so AdScan data stays scoped to the caller.

For ads.list only, you can pass spend, spendMin, or spendMax and AdManage will convert them to viewsMin/viewsMax using a fixed $13 CPM assumption.

To scrape a Meta Ads Library URL on demand, prefer the dedicated POST /v1/adscan/scrape + GET /v1/adscan/scrape/{jobId} endpoints.

curl https://api.admanage.ai/v1/adscan/trpc/{procedure} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "result": {
    "data": {
      "ads": [
        {
          "id": 634033,
          "advertiser": {
            "name": "Metrotile UK Ltd"
          },
          "cards": [
            {
              "title": "Europe’s Number One Lightweight Steel Roofing System"
            }
          ],
          "engagement": {
            "reach": 21166
          }
        },
        {
          "id": 634032,
          "reach": 250000
        }
      ],
      "hasMore": true
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


AdScan Mutation Wrapper

#

Proxy any AdScan tRPC mutation through AdManage. Replace {procedure} with a write procedure such as boards.create, boards.update, ads.addToBoard, companies.follow, or notifications.upsertRule.

POST/v1/adscan/trpc/{procedure}

Use POST with the same JSON body that AdScan expects for the target mutation.

Common write procedures: boards.create, boards.update, boards.remove, boards.updateSlug, ads.addToBoard, ads.removeFromBoard, ads.delete, companies.follow, companies.unfollow, notifications.upsertRule, brandSpy.enqueueScrape.

This endpoint follows AdManage's API-key permissions. Read-only keys can call GET wrappers but cannot use POST mutations.

To scrape a Meta Ads Library URL on demand, prefer the dedicated POST /v1/adscan/scrape endpoint instead of calling brandSpy.enqueueScrape through the raw proxy.

curl https://api.admanage.ai/v1/adscan/trpc/{procedure} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "name": "Competitor Winners"}'

Request Body

{
  "name": "Competitor Winners"
}

Response

{
  "result": {
    "data": {
      "id": 42,
      "name": "Competitor Winners"
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Shared APIs

#

Cross-platform reporting, creative workflow, accounts, automation, and supporting utilities.

Reporting Core

Cross-platform reports, top-ads, spend, and baseline performance surfaces.

Reports

#

Query Reports

#

Query ad performance data for Meta/Facebook, TikTok, and Pinterest. Uses BigQuery first for Meta and falls back to platform-specific APIs where needed. This shared endpoint does not cover Snapchat, Google Ads, LinkedIn, or Taboola.

GET/v1/reports/query

Query Parameters

?accountIds=act_123456789&startDate=2026-02-01&endDate=2026-02-19&metrics=spend,impressions,clicks,ctr,cpm&groupBy=adId&sortBy=spend&sortDirection=DESC&limit=100&offset=0&filterOperator=AND&adSetIds=23851234567890,23851234567891&campaignIds=23851000000001

Required: accountIds, startDate, endDate, metrics.

This endpoint is paginated. Increase limit to return more rows per request, up to 100 at a time.

Use offset to fetch the next page: start with offset=0, then 100, 200, 300, and continue until pagination.hasMore is false.

Metrics: spend, impressions, clicks, ctr, cpm, cpc, reach, frequency, videoViews, hookRate, purchases, purchaseValue, roas, etc.

Use groupBy=campaignName for campaign tables and groupBy=adsetName for ad set tables.

Group by: adId (default), adName, campaignName, adsetName, landingPage, assetType, creative, body, title, callToActionType, adStatus, objective.

adSetIds: comma-separated ad set IDs to filter results to specific ad sets (e.g. adSetIds=23851234567890,23851234567891).

campaignIds: comma-separated campaign IDs to filter results to specific campaigns (e.g. campaignIds=23851000000001).

filterOperator: AND (default) or OR — controls how multiple filters combine.

excludePatterns: comma-separated patterns to strip from ad names when grouping (e.g. '- Copy,- v2').

filters: JSON-encoded array. Operators: EQUALS, NOT_EQUALS, CONTAINS, NOT_CONTAINS, STARTS_WITH, ENDS_WITH, IN, NOT_IN, HIGHER_THAN, LOWER_THAN, BETWEEN, NOT_BETWEEN, EMPTY, NOT_EMPTY.

Account ownership is validated — invalid account IDs are skipped with a warning.

When data is empty, returns 200 with data: [] and metadata.warnings explaining why (e.g. pipeline not configured, no token found).

New accounts with no spend data return an empty response with warnings — never a 500.

Channel coverage: use this for Meta/Facebook, TikTok, and Pinterest. For Snapchat use GET /v1/spend/daily or the /v1/manage/snapchat/* endpoints, for Google Ads use the /v1/google-ads/* endpoints, and for LinkedIn use GET /v1/linkedin/manage.

Use GET /v1/reports/fields for full list of available metrics and dimensions.

curl https://api.admanage.ai/v1/reports/query \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "adId": "120012345678901234",
      "adName": "Spring Launch - UGC 1",
      "spend": 842.22,
      "impressions": 145000,
      "clicks": 3200,
      "ctr": 0.022,
      "thumbnailUrl": "https://..."
    }
  ],
  "pagination": {
    "offset": 0,
    "limit": 25,
    "total": 142,
    "hasMore": true
  },
  "metadata": {
    "platform": "facebook",
    "source": "bigquery"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Report Fields

#

Returns available dimensions and metrics for building GET /v1/reports/query requests. These fields apply to the shared Meta/Facebook, TikTok, and Pinterest reporting endpoint.

GET/v1/reports/fields
curl https://api.admanage.ai/v1/reports/fields \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "dimensions": [
    {
      "name": "adId",
      "label": "Ad ID",
      "type": "dimension"
    },
    {
      "name": "adName",
      "label": "Ad Name",
      "type": "dimension"
    },
    {
      "name": "campaignName",
      "label": "Campaign Name",
      "type": "dimension"
    }
  ],
  "metrics": [
    {
      "name": "spend",
      "label": "Spend",
      "type": "metric",
      "format": "currency"
    },
    {
      "name": "impressions",
      "label": "Impressions",
      "type": "metric",
      "format": "number"
    },
    {
      "name": "ctr",
      "label": "CTR",
      "type": "calculated",
      "format": "percent"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Meta Reach Composition

#

Return monthly Meta reach composition for one ad account, including cumulative reach and incremental reach (same as net-new reach). Mirrors the core calculations used in the AdManage reach report.

GET/v1/reports/meta/reach-composition

Query Parameters

?accountId=act_123456789&startDate=2025-01-01&endDate=2025-03-31&campaignIds=12020001,12020002&countries=US,CA

Required: accountId, startDate, endDate.

Meta only. Pass one Meta ad account ID per request.

incrementalReach is an alias of netNewReach.

campaignIds and countries are optional comma-separated filters.

When campaign filters are applied, cumulative reach is rebased so the filtered series starts at a zero baseline.

If access is missing or expired, the endpoint returns empty data with details in metadata.warnings and may include metadata.requiresReauth=true.

curl https://api.admanage.ai/v1/reports/meta/reach-composition \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "month": "2025-01",
      "monthLabel": "Jan 2025",
      "reach": 120000,
      "cumulativeReach": 120000,
      "rawNetNewReach": 120000,
      "netNewReach": 120000,
      "incrementalReach": 120000,
      "previouslyReached": 0,
      "pctNetNew": 100,
      "impressions": 210000,
      "frequency": 1.75
    },
    {
      "month": "2025-02",
      "monthLabel": "Feb 2025",
      "reach": 90000,
      "cumulativeReach": 176000,
      "rawNetNewReach": 56000,
      "netNewReach": 56000,
      "incrementalReach": 56000,
      "previouslyReached": 34000,
      "pctNetNew": 62.22,
      "impressions": 171000,
      "frequency": 1.9
    }
  ],
  "summary": {
    "totalCumulativeReach": 176000,
    "lastMonthNetNewReach": 56000,
    "lastMonthIncrementalReach": 56000,
    "avgPctNetNew": 81.11,
    "avgFrequency": 1.825,
    "trend": "down"
  },
  "filters": {
    "campaigns": [
      {
        "id": "12020001",
        "name": "Q1 Broad",
        "spend": 1425.32,
        "status": "ACTIVE",
        "isActive": true
      }
    ],
    "countries": [
      {
        "code": "US",
        "name": "US",
        "spend": 1300.22
      }
    ]
  },
  "metadata": {
    "platform": "facebook",
    "source": "facebook_api"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Meta Country Breakdown

#

Return Meta spend, impressions, clicks, and conversion actions broken down by country for one ad account. Use this when you need country-level spend (e.g. UK-only) — the standard /v1/reports/query endpoint does not expose a country dimension. Also returns per-campaign × country rows.

GET/v1/reports/meta/country-breakdown

Query Parameters

?accountId=act_123456789&startDate=2026-01-01&endDate=2026-01-31&campaignIds=12020001,12020002&countries=US,GB

Required: accountId, startDate, endDate.

Meta only. Pass one Meta ad account ID per request.

countries and campaignIds are optional comma-separated filters. Country codes are ISO-2 (e.g. US, GB, CA).

Data is aggregated by country for the full period — the endpoint does not return a daily breakdown.

If access is missing or expired, the endpoint returns empty data with details in metadata.warnings and may include metadata.requiresReauth=true.

curl https://api.admanage.ai/v1/reports/meta/country-breakdown \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "country": "GB",
      "spend": 1820.45,
      "impressions": 210000,
      "clicks": 4800,
      "actions": [
        {
          "action_type": "purchase",
          "value": 58
        }
      ],
      "action_values": [
        {
          "action_type": "purchase",
          "value": 4120.3
        }
      ]
    },
    {
      "country": "US",
      "spend": 1320.12,
      "impressions": 180000,
      "clicks": 3600,
      "actions": [
        {
          "action_type": "purchase",
          "value": 42
        }
      ],
      "action_values": [
        {
          "action_type": "purchase",
          "value": 2980.55
        }
      ]
    }
  ],
  "campaigns": [
    {
      "campaignId": "12020001",
      "campaignName": "Q1 Prospecting",
      "country": "GB",
      "spend": 1120,
      "impressions": 130000,
      "clicks": 3100
    },
    {
      "campaignId": "12020001",
      "campaignName": "Q1 Prospecting",
      "country": "US",
      "spend": 820,
      "impressions": 110000,
      "clicks": 2400
    }
  ],
  "summary": {
    "totalSpend": 3140.57,
    "totalImpressions": 390000,
    "totalClicks": 8400,
    "topCountry": {
      "country": "GB",
      "spend": 1820.45,
      "percentage": 57.96
    },
    "countryCount": 2,
    "accountCurrency": "USD"
  },
  "metadata": {
    "platform": "facebook",
    "source": "facebook_api"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Analytics

#

Top Ads

#

Get your top-performing ads sorted by spend, enriched with creative data (thumbnails, ad type detection, video sources). Supports Meta/Facebook and TikTok accounts with automatic platform detection. This endpoint does not currently cover Snapchat, Pinterest, Google Ads, or LinkedIn.

GET/v1/analytics/top-ads

Query Parameters

?accountIds=act_384730851257635&startDate=2026-02-01&endDate=2026-03-01&limit=10&page=1

This is the public API equivalent of the /reports/top-ads dashboard page.

Top means ranked by spend descending.

If you want the full ad list and plan to filter it yourself, use GET /v1/reports/query instead.

Required: accountIds, startDate, endDate.

Optional filters: campaignIds, adSetIds, adType (video | image | carousel).

Pagination: limit (max 50, default 10), page (default 1).

Platform is auto-detected from the account ID. Meta/Facebook (act_*) and TikTok are supported.

Creative enrichment includes ad type detection (video/image/carousel), high-res thumbnails, and video sources.

For Facebook, detailed metrics include actions, conversions, and purchase_roas arrays.

If you need Pinterest tables, use GET /v1/reports/query. If you need Snapchat spend, use GET /v1/spend/daily. Google Ads has its own /v1/google-ads/* reporting endpoints.

Date range cannot exceed 365 days.

curl https://api.admanage.ai/v1/analytics/top-ads \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "ad_id": "123456789",
      "ad_name": "Summer Sale Video",
      "campaign_name": "Prospecting Q1",
      "adset_id": "987654321",
      "spend": 1250.5,
      "impressions": 85000,
      "clicks": 2100,
      "ctr": 2.47,
      "cpc": 0.6,
      "cpm": 14.71,
      "frequency": 1.8,
      "roas": 3.2,
      "adType": "video",
      "thumbnail_url": "https://scontent.xx.fbcdn.net/...",
      "platform": "facebook",
      "currency": "USD"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 45,
    "hasMore": true
  },
  "metadata": {
    "platform": "facebook",
    "startDate": "2026-02-01",
    "endDate": "2026-03-01",
    "currency": "USD"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Spend

#

Get Daily Ad Spend

#

Get daily ad spend per account across all connected platforms (Facebook/Meta, TikTok, Pinterest, Snapchat). Useful for balance management and budget monitoring. Uses BigQuery for Facebook with Graph API fallback. Date range capped at 90 days per request.

GET/v1/spend/daily

Query Parameters

?startDate=2026-03-01&endDate=2026-03-09&accountIds=act_384730851257635&platform=facebook

Use this to recreate the /data/cost daily spend chart in the dashboard.

Required params: startDate, endDate (YYYY-MM-DD format).

Optional params: accountIds (comma-separated), workspaceId, platform (facebook, tiktok, pinterest, snapchat).

This is the only documented public reporting endpoint that spans Meta, TikTok, Pinterest, and Snapchat together.

Date range is capped at 90 days per request.

If no accountIds are provided, returns spend for all accounts in your company.

If a platform fails (e.g. token expired), partial results are returned with an errors array.

When no matching accounts are found, returns a warnings array explaining why (e.g. invalid account IDs, no accounts connected).

Spend is returned in each account's native currency.

BigQuery data is typically one day lagged; today's spend may use the Facebook Graph API fallback.

curl https://api.admanage.ai/v1/spend/daily \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "date": "2026-03-01",
      "accountId": "act_384730851257635",
      "accountName": "Admanage Limited",
      "platform": "facebook",
      "currency": "GBP",
      "spend": 150.42
    },
    {
      "date": "2026-03-01",
      "accountId": "7486153503963054097",
      "accountName": "TikTok Main Account",
      "platform": "tiktok",
      "currency": "USD",
      "spend": 75
    },
    {
      "date": "2026-03-02",
      "accountId": "act_384730851257635",
      "accountName": "Admanage Limited",
      "platform": "facebook",
      "currency": "GBP",
      "spend": 142.18
    }
  ],
  "metadata": {
    "startDate": "2026-03-01",
    "endDate": "2026-03-09",
    "accountCount": 2,
    "totalSpend": 367.6,
    "platforms": [
      "facebook",
      "tiktok"
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Performance

#

Get Campaigns

#

List campaigns aggregated from ad sets by company.

GET/v1/campaigns

Query Parameters

?page=1&limit=25&platform=facebook&adAccountId=act_123456789
curl https://api.admanage.ai/v1/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "campaignId": "1200123000999",
      "campaignName": "Q1 Prospecting",
      "platform": "facebook",
      "accountId": "act_123456789",
      "status": "ACTIVE",
      "totalSpend": 842.22,
      "adSetCount": 4
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Ad Sets

#

List ad sets with status, spend, and ad count. Each ad set includes value and label fields so you can pass them directly into ads[].adSets[] when launching. Results are served from a local snapshot that auto-refreshes from the Meta Graph API when stale (older than 60 minutes) and after any ad-set mutation.

GET/v1/adsets

Query Parameters

?page=1&limit=25&campaignId=1200123000999&platform=facebook&adAccountId=act_123456789&refresh=true

Use adAccountId as the preferred public filter parameter.

businessId is also accepted as a compatibility alias and resolves to the same account lookup.

Each ad set includes value and label — pass the object directly into your launch request's adSets array.

Filter by accountId to list all ad sets for an account, or by campaignId to drill into a campaign.

Freshness (Meta only): the local snapshot auto-refreshes from the Meta Graph API when it is older than 60 minutes, and is also invalidated after create-adset, duplicate-adset, duplicate-adset-advanced, update-status, update-adset-budget, update-adset-bidding, and delete on adsets/campaigns. The next call re-fetches from Meta.

refresh=true (optional): forces a live Meta fetch before reading, regardless of staleness. Requires a single ad account in scope (accountId filter, or workspaceId scoped to one account). Meta only — ignored for other platforms.

Response includes a `freshness` object: `{ refreshed, refreshedAccountIds, lastRefreshedAt }` so you can tell how current the data is.

curl https://api.admanage.ai/v1/adsets \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "adSetId": "1200123999888",
      "name": "US Broad - 18+",
      "value": "1200123999888",
      "label": "US Broad - 18+",
      "campaignId": "1200123000999",
      "campaignName": "Q1 Prospecting",
      "account_id": "act_123456789",
      "platform": "facebook",
      "status": "ACTIVE",
      "campaignStatus": "ACTIVE",
      "adSpend": 210.56,
      "adCount": 8
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  },
  "freshness": {
    "refreshed": true,
    "refreshedAccountIds": [
      "123456789"
    ],
    "lastRefreshedAt": "2026-04-17T14:02:18.441Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Creative Workflow

Drafts, batches, templates, media upload, and creative library endpoints.

Drafts

#

Create Launch Draft

#

Save a new launch draft with creative state for later iteration and launching.

POST/v1/drafts

Returns 201 Created.

businessId is required.

workspaceId is optional. Omit it unless you need a specific workspace ID.

state holds the full creativeState (globalDefaults + rows).

In the docs runner, signed-in users auto-fill the default ad account and workspace where available.

curl https://api.admanage.ai/v1/drafts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "title": "My Draft",  "businessId": "act_123456789",  "state": {    "globalDefaults": {      "title": "Spring Sale",      "description": "Shop our collection",      "businessId": "act_123456789",      "adAccountType": "facebook",      "launchMode": "gallery",      "selectedAdSets": []    },    "rows": [      {        "id": "row-1",        "adName": "Creative 1",        "title": "Spring Sale",        "description": "Shop our collection",        "cta": "LEARN_MORE",        "link": "https://example.com",        "selectedAdSets": [],        "videos": [          {            "name": "creative-1.jpg",            "type": "image",            "preview": "https://example.com/creative-1.jpg"          }        ]      }    ]  }}'

Request Body

{
  "title": "My Draft",
  "businessId": "act_123456789",
  "state": {
    "globalDefaults": {
      "title": "Spring Sale",
      "description": "Shop our collection",
      "businessId": "act_123456789",
      "adAccountType": "facebook",
      "launchMode": "gallery",
      "selectedAdSets": []
    },
    "rows": [
      {
        "id": "row-1",
        "adName": "Creative 1",
        "title": "Spring Sale",
        "description": "Shop our collection",
        "cta": "LEARN_MORE",
        "link": "https://example.com",
        "selectedAdSets": [],
        "videos": [
          {
            "name": "creative-1.jpg",
            "type": "image",
            "preview": "https://example.com/creative-1.jpg"
          }
        ]
      }
    ]
  }
}

Response

{
  "id": 42,
  "title": "My Draft",
  "businessId": "act_123456789",
  "workspaceId": null,
  "status": "draft",
  "user": "[email protected]",
  "company": "acme",
  "createdAt": "2026-02-19T10:00:00.000Z",
  "state": {
    "globalDefaults": {
      "title": "Spring Sale",
      "description": "Shop our collection",
      "businessId": "act_123456789",
      "adAccountType": "facebook",
      "launchMode": "gallery",
      "selectedAdSets": []
    },
    "rows": [
      {
        "id": "row-1",
        "adName": "Creative 1",
        "title": "Spring Sale",
        "description": "Shop our collection",
        "cta": "LEARN_MORE",
        "link": "https://example.com",
        "selectedAdSets": [],
        "videos": [
          {
            "name": "creative-1.jpg",
            "type": "image",
            "preview": "https://example.com/creative-1.jpg"
          }
        ]
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Launch Drafts

#

Paginated list of launch drafts. Does not include the state field (large JSON) — use GET /v1/drafts/:id to load full state.

GET/v1/drafts

Query Parameters

?page=1&limit=25&businessId=act_123456789

Filters: businessId, workspaceId, search.

state is omitted from list results for performance.

curl https://api.admanage.ai/v1/drafts \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": 42,
      "title": "My Draft",
      "businessId": "act_123456789",
      "workspaceId": "workspace_abc",
      "status": "draft",
      "user": "[email protected]",
      "company": "acme",
      "createdAt": "2026-02-19T10:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Launch Draft By ID

#

Fetch a single launch draft including the full state (creativeState JSON).

GET/v1/drafts/{id}
curl https://api.admanage.ai/v1/drafts/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "id": 42,
    "title": "My Draft",
    "businessId": "act_123456789",
    "workspaceId": "workspace_abc",
    "status": "draft",
    "user": "[email protected]",
    "company": "acme",
    "createdAt": "2026-02-19T10:00:00.000Z",
    "state": {
      "globalDefaults": {
        "title": "Spring Sale"
      },
      "rows": [
        {
          "id": "row-1",
          "adName": "Creative 1"
        }
      ]
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Launch Draft

#

Partial update of a launch draft. Update title, state, status, businessId, or workspaceId.

PATCH/v1/drafts/{id}

All fields are optional — only provided fields are updated.

curl https://api.admanage.ai/v1/drafts/{id} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "title": "Updated Draft",  "state": {    "globalDefaults": {      "title": "Summer Sale"    },    "rows": [      {        "id": "row-1",        "adName": "Updated Creative"      }    ]  }}'

Request Body

{
  "title": "Updated Draft",
  "state": {
    "globalDefaults": {
      "title": "Summer Sale"
    },
    "rows": [
      {
        "id": "row-1",
        "adName": "Updated Creative"
      }
    ]
  }
}

Response

{
  "success": true,
  "data": {
    "id": 42,
    "title": "Updated Draft",
    "status": "draft",
    "state": {
      "globalDefaults": {
        "title": "Summer Sale"
      },
      "rows": [
        {
          "id": "row-1",
          "adName": "Updated Creative"
        }
      ]
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Delete Launch Draft

#

Delete a launch draft. Company-scoped — only drafts belonging to your company can be deleted.

DELETE/v1/drafts/{id}
curl https://api.admanage.ai/v1/drafts/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "message": "Draft deleted"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Launch Draft

#

Launch a saved draft. Loads the draft state, creates an ad batch, dispatches to launcher, and marks the draft as 'launched'.

POST/v1/drafts/{id}/launch

Returns 202 Accepted — the launch is asynchronous.

Poll GET /v1/batch-status/{adBatchId} to track progress.

Draft status is updated to 'launched' on success.

curl https://api.admanage.ai/v1/drafts/{id}/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 9913,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Batches

#

Get Ad Batches

#

Paginated list of launch batches (recent launch history).

GET/v1/adbatches

Query Parameters

?page=1&limit=35&search=prospecting&workspaceId=workspace_abc&privateHistory=true
curl https://api.admanage.ai/v1/adbatches \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": 9911,
      "slug": "batch-abc123",
      "status": "Processing",
      "dateAdded": "2026-02-18T16:17:00.000Z",
      "accountName": "Main Account",
      "adAccountId": "act_123456789",
      "adCount": 12,
      "adSetCount": 2
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 35,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Ad Batch By ID

#

Fetch a specific batch by numeric ID or slug, including creativeState.

GET/v1/adbatches/{id}
curl https://api.admanage.ai/v1/adbatches/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "id": 9911,
  "slug": "batch-abc123",
  "status": "Processing",
  "title": "Spring Launch",
  "data": "{...}",
  "failedAds": [],
  "batchData": {
    "creativeState": "{...}"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Ad Delivery Statuses

#

Get the Meta delivery status (effective_status) of each ad in a completed batch. Poll until allSettled=true.

GET/v1/adbatches/{id}/ad-delivery-statuses

Query Parameters

?refresh=true

id (path): batch ID or slug.

refresh=true: bypass cache and re-fetch from Meta.

Meta batches only — TikTok/other platforms return an empty result with a message.

allSettled=true when all ads are in a terminal state (ACTIVE, PAUSED, DISAPPROVED, WITH_ISSUES, etc.).

When allSettled=false, some ads are still pending — poll again after a few minutes.

Pending ads are cached for 2 minutes; terminal results are cached permanently.

curl https://api.admanage.ai/v1/adbatches/{id}/ad-delivery-statuses \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "batchId": 9911,
  "adDeliveryStatuses": {
    "120249137908810789": {
      "effectiveStatus": "ACTIVE",
      "status": "ACTIVE",
      "configuredStatus": "ACTIVE",
      "issuesInfo": [],
      "checkedAt": "2026-03-30T10:15:00.000Z"
    },
    "120249137908810790": {
      "effectiveStatus": "PENDING_REVIEW",
      "status": "ACTIVE",
      "configuredStatus": "ACTIVE",
      "issuesInfo": [],
      "checkedAt": "2026-03-30T10:15:00.000Z"
    }
  },
  "allSettled": false,
  "fromCache": false,
  "checkedAt": "2026-03-30T10:15:00.000Z"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Templates

#

Get Ad Templates

#

List ad-copy templates with pagination.

GET/v1/templates/ad-copy

Query Parameters

?page=1&pageSize=10
curl https://api.admanage.ai/v1/templates/ad-copy \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": "copy_abcd1234",
      "name": "UGC Static Template",
      "defaultTitle": "Free Trial",
      "defaultDescription": "Try it today",
      "businessId": "act_123456789"
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 10,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Ad Template Copy Details

#

Fetch one ad template with detailed copy fields and generated copy rows.

GET/v1/templates/ad-copy/{id}
curl https://api.admanage.ai/v1/templates/ad-copy/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "id": "copy_abcd1234",
    "name": "UGC Static Template",
    "businessId": "act_123456789",
    "defaultTitle": "Free Trial",
    "defaultDescription": "Try it today",
    "titleVariations": [
      "Free Trial",
      "Try It Free"
    ],
    "descriptionVariations": [
      "Try it today",
      "Start now"
    ],
    "copies": [
      {
        "index": 1,
        "title": "Free Trial",
        "description": "Try it today"
      },
      {
        "index": 2,
        "title": "Try It Free",
        "description": "Start now"
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Uploading Media

#

Upload Media

#

Upload a media file using multipart/form-data. The file stream is proxied to upload-api.

POST/v1/media/upload

Use multipart/form-data with field name 'file'.

For URL-based uploads, use POST /v1/media/upload/url.

The id/adid fields are numbers (not strings). You do NOT need to pass these IDs back when launching — just use the returned url in your media array.

To launch with an uploaded file: { media: [{ url: "<returned url>" }] }. Type (video/image) is auto-detected from the filename extension.

curl https://api.admanage.ai/v1/media/upload \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=<binary-file>"

Request Body

{
  "file": "<binary-file>"
}

Response

{
  "success": true,
  "url": "https://media.admanage.ai/acme/summer-ugc-v1.mp4",
  "filename": "summer-ugc-v1.mp4",
  "originalName": "Summer UGC V1.mp4",
  "wasRenamed": false,
  "id": 123456,
  "adid": 123456,
  "adids": [
    123456
  ],
  "dimensions": {
    "width": 1080,
    "height": 1920
  }
}

Upload Media From URL

#

Upload media by providing a public URL. The file is downloaded and stored on AdManage's CDN. Use the returned url in your launch request.

POST/v1/media/upload/url

The id/adid fields are numbers (not strings). You do NOT need to pass these back — just use the returned url.

To launch with this media: { media: [{ url: "<returned url>" }] }.

curl https://api.admanage.ai/v1/media/upload/url \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "url": "https://cdn.example.com/creative.mp4"}'

Request Body

{
  "url": "https://cdn.example.com/creative.mp4"
}

Response

{
  "success": true,
  "url": "https://media.admanage.ai/acme/summer-ugc-v1.mp4",
  "filename": "summer-ugc-v1.mp4",
  "originalName": "summer-ugc-v1.mp4",
  "wasRenamed": false,
  "id": 123456,
  "adid": 123456,
  "adids": [
    123456
  ],
  "dimensions": {
    "width": 1080,
    "height": 1920
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Check Media Filename

#

Check whether a filename already exists before upload.

POST/v1/media/upload/check
curl https://api.admanage.ai/v1/media/upload/check \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "fileName": "summer-ugc-v1.mp4"}'

Request Body

{
  "fileName": "summer-ugc-v1.mp4"
}

Response

{
  "exists": true,
  "existingFile": {
    "id": 987,
    "adid": 123456,
    "name": "summer-ugc-v1.mp4",
    "url": "https://media.admanage.ai/acme/summer-ugc-v1.mp4"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Search Stored Media

#

List and filter stored media creatives by query, tags, type, status, and dimensions with paginated results.

GET/v1/media/search

Query Parameters

?q=summer&type=video&tags=ugc,hook&page=1&limit=25

Supported query params: q, tags (comma-separated), status, type (image|video), dimension, page, limit.

Only returns media records that already have an adid.

curl https://api.admanage.ai/v1/media/search \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "media": [
    {
      "id": 1,
      "adid": 123,
      "name": "summer-campaign.mp4",
      "originalName": "Summer Campaign Video.mp4",
      "url": "https://media.admanage.ai/acme/summer-campaign.mp4",
      "thumbnail": "https://media.admanage.ai/acme/summer-campaign-thumb.jpg",
      "customThumbnail": null,
      "dimension": "1920x1080",
      "mimeType": "video/mp4",
      "size": "5242880",
      "status": "approved",
      "dateAdded": "2026-01-10T12:00:00.000Z",
      "duration": 30,
      "tags": [
        "brand",
        "summer-2026"
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1,
    "hasMore": false
  },
  "filters": {
    "query": "summer",
    "tags": [
      "ugc",
      "hook"
    ],
    "status": null,
    "type": "video",
    "dimension": null
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Stored Media By ID

#

Retrieve a single stored media creative by numeric adid.

GET/v1/media/{id}

id in path is the media adid (number).

curl https://api.admanage.ai/v1/media/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "media": {
    "id": 1,
    "adid": 123,
    "name": "summer-campaign.mp4",
    "originalName": "Summer Campaign Video.mp4",
    "url": "https://media.admanage.ai/acme/summer-campaign.mp4",
    "thumbnail": "https://media.admanage.ai/acme/summer-campaign-thumb.jpg",
    "customThumbnail": null,
    "dimension": "1920x1080",
    "width": 1920,
    "height": 1080,
    "size": "5242880",
    "mimeType": "video/mp4",
    "status": "Not Launched",
    "uploaderStatus": "approved",
    "dateAdded": "2026-01-10T12:00:00.000Z",
    "lastUpdated": "2026-01-12T09:24:00.000Z",
    "source": null,
    "duration": 30,
    "rating": 4,
    "smartSummary": "UGC testimonial with product demo",
    "smartTags": [
      "ugc",
      "testimonial",
      "product-demo"
    ],
    "spriteUrl": null,
    "tags": [
      "brand",
      "summer-2026"
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Upload URL

#

Get a presigned URL for direct media file upload. The URL expires in 1 hour. Upload the file via multipart POST to the returned URL, then call confirm-upload to register it.

POST/v1/media/get-upload-url

fileName (required): original filename with extension.

Upload flow: get-upload-url → upload file to URL → confirm-upload.

The presigned URL expires in 1 hour.

curl https://api.admanage.ai/v1/media/get-upload-url \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "fileName": "creative-hero.mp4"}'

Request Body

{
  "fileName": "creative-hero.mp4"
}

Response

{
  "success": true,
  "data": {
    "uploadUrl": "https://media.admanage.ai/upload/presigned-url",
    "fileKey": "uploads/abc123/creative-hero.mp4",
    "uploadViaProxy": "https://media.admanage.ai/upload/proxy-url",
    "uploadMethod": "POST multipart/form-data with field 'file'"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Confirm Upload

#

Register an uploaded file in the media library after uploading via the presigned URL. Returns the new asset with metadata.

POST/v1/media/confirm-upload

url (required): the media.admanage.ai URL after upload.

fileName (optional): original filename for display.

curl https://api.admanage.ai/v1/media/confirm-upload \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "url": "https://media.admanage.ai/uploads/abc123/creative-hero.mp4",  "fileName": "creative-hero.mp4"}'

Request Body

{
  "url": "https://media.admanage.ai/uploads/abc123/creative-hero.mp4",
  "fileName": "creative-hero.mp4"
}

Response

{
  "success": true,
  "data": {
    "id": 123456,
    "url": "https://media.admanage.ai/uploads/abc123/creative-hero.mp4",
    "thumbnail": "https://media.admanage.ai/thumbnails/abc123.jpg",
    "mimeType": "video/mp4",
    "size": 15728640,
    "name": "creative-hero.mp4",
    "dimension": "1080x1920",
    "duration": 30
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Generate Thumbnail

#

Generate a thumbnail for a video file. Non-blocking — can be called after confirm-upload.

POST/v1/media/generate-thumbnail

url (required): media.admanage.ai video URL.

Non-video files return a skip message.

curl https://api.admanage.ai/v1/media/generate-thumbnail \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "url": "https://media.admanage.ai/uploads/abc123/creative-hero.mp4"}'

Request Body

{
  "url": "https://media.admanage.ai/uploads/abc123/creative-hero.mp4"
}

Response

{
  "success": true,
  "message": "Thumbnail generated successfully",
  "thumbnailUrl": "https://media.admanage.ai/thumbnails/abc123.jpg",
  "duration": 30
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Browse Google Drive

#

Browse Google Drive folders and files. Returns launchable media URLs for videos and images.

GET/v1/drive/browse

Query Parameters

?folderId=root&scope=my-drive&pageSize=100&workspaceId=workspace_abc

folderId: Google Drive folder ID or 'root' (default).

scope: 'my-drive' (default) or 'shared-with-me'.

search: filter by filename.

pageSize: max 1000, default 100.

Requires a connected Google Drive account.

curl https://api.admanage.ai/v1/drive/browse \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "files": [
      {
        "id": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms",
        "name": "creative.mp4",
        "mimeType": "video/mp4",
        "size": 15728640,
        "modifiedTime": "2026-03-20T12:00:00.000Z",
        "launchUrl": "https://media.admanage.ai/drive/abc123.mp4"
      }
    ],
    "nextPageToken": "token_for_next_page"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Browse Dropbox

#

Browse Dropbox folders and files, including shared links. Returns launchable media URLs.

GET/v1/dropbox/browse

Query Parameters

?path=&sharedLink=https://www.dropbox.com/scl/fo/abc123/AAA&limit=100

path: folder path (default: root).

sharedLink: Dropbox shared link URL for accessing shared folders.

search: filter by filename.

limit: max 100, default 100.

Requires a connected Dropbox account.

curl https://api.admanage.ai/v1/dropbox/browse \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "files": [
      {
        "id": "id:abc123",
        "name": "hero-video.mp4",
        "pathDisplay": "/Creatives/hero-video.mp4",
        "isFolder": false,
        "size": 15728640,
        "modifiedTime": "2026-03-20T12:00:00.000Z",
        "launchUrl": "https://media.admanage.ai/dropbox/abc123.mp4"
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Library

#

List Library Assets

#

Search and filter creative assets in the media library with cursor-based pagination.

GET/v1/library/assets

Query Parameters

?limit=25&filterType=video&sortBy=dateCreated&sortOrder=desc&search=ugc

Cursor-based pagination (limit + cursor). Max 100 per page.

filterType: all, image, video, gif.

sortBy: dateCreated, dateModified, name, size.

launchChannels: comma-separated (meta, tiktok, snapchat, pinterest, axon).

dimension: exact (1080x1920) or aspect ratio (9:16).

curl https://api.admanage.ai/v1/library/assets \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "assets": [
    {
      "id": 12345,
      "adid": 67890,
      "name": "Spring-UGC.mp4",
      "url": "https://media.admanage.ai/acme/Spring-UGC.mp4",
      "thumbnail": "https://media.admanage.ai/acme/thumb-Spring-UGC.jpg",
      "type": "video",
      "uploaderStatus": "approved",
      "status": "Launched",
      "launchChannels": [
        {
          "platform": "meta",
          "adIds": [
            "120012345678901234"
          ]
        }
      ],
      "tags": [
        {
          "id": 1,
          "name": "UGC"
        }
      ],
      "boardIds": [
        10
      ]
    }
  ],
  "nextCursor": "12344",
  "hasMore": true,
  "total": 847
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Library Asset

#

Fetch a single asset by ID with full details including transcript, comments, and launch channels.

GET/v1/library/assets/{id}

Looks up by both internal id and external adid.

curl https://api.admanage.ai/v1/library/assets/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "id": 12345,
    "name": "Spring-UGC.mp4",
    "url": "https://media.admanage.ai/acme/Spring-UGC.mp4",
    "type": "video",
    "transcript": "Hey guys, check out this amazing product...",
    "smartSummary": "UGC testimonial video featuring product demo",
    "smartTags": [
      "ugc",
      "testimonial",
      "product-demo"
    ],
    "launchChannels": [
      {
        "platform": "meta",
        "adIds": [
          "120012345678901234"
        ]
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Library Boards

#

List boards as a hierarchical tree with asset counts. Team boards are visible to all; private boards only to their creator.

GET/v1/library/boards
curl https://api.admanage.ai/v1/library/boards \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": 10,
      "name": "Q1 Creatives",
      "visibility": "team",
      "assetCount": 42,
      "children": [
        {
          "id": 11,
          "name": "UGC",
          "assetCount": 18,
          "children": []
        }
      ]
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Board Assets

#

List assets in a specific board. Same filters and response shape as GET /v1/library/assets.

GET/v1/library/boards/{id}/assets

Query Parameters

?limit=25&sortBy=dateCreated

Returns 404 if board does not exist or does not belong to the company.

curl https://api.admanage.ai/v1/library/boards/{id}/assets \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "assets": [
    {
      "id": 12345,
      "name": "Spring-UGC.mp4",
      "type": "video",
      "boardIds": [
        10
      ]
    }
  ],
  "nextCursor": null,
  "hasMore": false,
  "total": 18
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Library Tags

#

List all tags in the media library for the authenticated company.

GET/v1/library/tags
curl https://api.admanage.ai/v1/library/tags \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "UGC",
      "company": "acme"
    },
    {
      "id": 2,
      "name": "Product Demo",
      "company": "acme"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Library Asset

#

Update a media asset's metadata — rename, change status, add tags, or set a rating.

POST/v1/library/assets/{id}/update

id (path): numeric asset ID from list_library_assets.

uploaderStatus: 'raw', 'in_progress', 'approved', or 'archived'.

rating: 1-5.

All fields are optional — only provided fields are updated.

curl https://api.admanage.ai/v1/library/assets/{id}/update \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "name": "Q1 Hero Video - Final",  "uploaderStatus": "approved",  "rating": 5,  "smartTags": [    "hero",    "q1",    "video"  ]}'

Request Body

{
  "name": "Q1 Hero Video - Final",
  "uploaderStatus": "approved",
  "rating": 5,
  "smartTags": [
    "hero",
    "q1",
    "video"
  ]
}

Response

{
  "success": true,
  "data": {}
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Create Library Board

#

Create a new board (folder) in your creative library to organize media assets. Boards can be nested under a parent board.

POST/v1/library/boards

name (required): board name.

parentId (optional): nest under a parent board.

visibility: 'team' (default, everyone can see) or 'private' (only you).

curl https://api.admanage.ai/v1/library/boards \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "name": "Q1 Creatives",  "description": "All approved Q1 campaign creatives",  "visibility": "team"}'

Request Body

{
  "name": "Q1 Creatives",
  "description": "All approved Q1 campaign creatives",
  "visibility": "team"
}

Response

{
  "success": true,
  "data": {
    "id": 10,
    "name": "Q1 Creatives",
    "description": "All approved Q1 campaign creatives",
    "visibility": "team"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Add Asset to Board

#

Add a media asset to a board. An asset can belong to multiple boards.

POST/v1/library/boards/{id}/assets

id (path): board ID from list_library_boards.

adId (body): asset ID from list_library_assets.

curl https://api.admanage.ai/v1/library/boards/{id}/assets \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "adId": 12345}'

Request Body

{
  "adId": 12345
}

Response

{
  "success": true,
  "data": {}
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Remove Asset from Board

#

Remove a media asset from a board. Only removes the association — the asset itself is not deleted.

DELETE/v1/library/boards/{id}/assets

Query Parameters

?adId=12345

id (path): board ID.

adId (query): asset ID to remove.

curl https://api.admanage.ai/v1/library/boards/{id}/assets \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {}
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Accounts & Automation

Accounts, automations, Google Sheets, YouTube, and changelog support.

Accounts

#

Get Ad Accounts

#

List ad accounts available to the authenticated company.

GET/v1/adaccounts

Query Parameters

?page=1&limit=25
curl https://api.admanage.ai/v1/adaccounts \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": 101,
      "accountId": "act_123456789",
      "accountName": "Main Account",
      "businessId": "act_123456789",
      "businessName": "Main Business",
      "workspaceId": "workspace_abc",
      "type": "facebook"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Profiles (Pages & Instagram)

#

Fetch Facebook Pages, Instagram accounts, and Threads profiles. Use the pageId values as the 'page' (Facebook) and 'insta' (Instagram) fields when launching ads. Falls back to live Facebook Graph API if the DB cache is empty.

GET/v1/profiles

Query Parameters

?businessId=act_123456789

All query params are optional. Omit everything to list all profiles for your company.

businessId: filter by ad account. workspaceId is auto-discovered if omitted.

type: filter by 'facebook', 'instagram', or 'threads'.

refresh=true: bypass cache and fetch live from Facebook Graph API.

Use pageId from type='facebook' as the 'page' field in launch requests.

Use pageId from type='instagram' as the 'insta' field in launch requests.

curl https://api.admanage.ai/v1/profiles \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "profiles": [
      {
        "pageId": "470703006115773",
        "pageName": "Brand Page",
        "type": "facebook",
        "pagePicture": "https://scontent.xx.fbcdn.net/...",
        "businessId": "act_123456789"
      },
      {
        "pageId": "17841471826052348",
        "pageName": "brand_ig",
        "type": "instagram",
        "pagePicture": "https://scontent.xx.fbcdn.net/...",
        "businessId": "act_123456789",
        "relatedPageId": "470703006115773",
        "followers": 15200
      }
    ],
    "counts": {
      "facebook": 1,
      "instagram": 1,
      "threads": 0
    },
    "grouped": {
      "facebook": [
        {
          "pageId": "470703006115773",
          "pageName": "Brand Page"
        }
      ],
      "instagram": [
        {
          "pageId": "17841471826052348",
          "pageName": "brand_ig"
        }
      ],
      "threads": []
    }
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get User Info

#

Return user profile, organizations, workspaces, and ad-account settings.

GET/v1/user/extended2
curl https://api.admanage.ai/v1/user/extended2 \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "id": "user_123",
  "email": "[email protected]",
  "company": "acme",
  "defaultWorkspaceId": "workspace_abc",
  "workspaces": [
    {
      "id": "workspace_abc",
      "name": "Main Workspace"
    }
  ],
  "organizations": [
    {
      "id": "org_123",
      "name": "Acme"
    }
  ],
  "settings": [
    {
      "accountId": "act_123456789",
      "accountName": "Main Account"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Workspaces

#

List all workspaces in the authenticated company.

GET/v1/workspaces

Query Parameters

?page=1&limit=25
curl https://api.admanage.ai/v1/workspaces \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "data": [
    {
      "id": "workspace_abc",
      "name": "Main Workspace",
      "company": "acme",
      "organizationId": "org_123",
      "metaAccountId": 12,
      "tiktokAccountId": null,
      "adAccounts": [
        {
          "id": 101,
          "accountId": "act_123456789",
          "accountName": "Main Account",
          "businessId": "act_123456789",
          "businessName": "Main Business",
          "type": "facebook",
          "workspaceId": "workspace_abc"
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Launch Defaults

#

Update saved launch defaults for an ad account — page, Instagram, copy, CTA, link, UTM tags, naming convention, and creative enhancements.

PATCH/v1/launch-defaults

accountId (optional): defaults to user's default account.

All fields are optional — only provided fields are updated.

Supports: page, insta, title, description, adDescription, cta, link, displaylink, urlTags, naming, namingSeparator, launchPaused, enhancedCreative, multiAdvertiser, instagramOnly, scalePostId, adCreationCutoff.

curl https://api.admanage.ai/v1/launch-defaults \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "accountId": "act_384730851257635",  "title": "Check out our new collection!",  "cta": "SHOP_NOW",  "link": "https://example.com/shop",  "urlTags": "utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}",  "launchPaused": true,  "enhancedCreative": false}'

Request Body

{
  "accountId": "act_384730851257635",
  "title": "Check out our new collection!",
  "cta": "SHOP_NOW",
  "link": "https://example.com/shop",
  "urlTags": "utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}",
  "launchPaused": true,
  "enhancedCreative": false
}

Response

{
  "success": true,
  "message": "Updated 5 setting(s) for act_384730851257635",
  "updated": {
    "title": "Check out our new collection!",
    "cta": "SHOP_NOW",
    "link": "https://example.com/shop",
    "urlTags": "utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}",
    "launchPaused": true
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Automations

#

List Automation Rules

#

Paginated list of automation rules filtered by status, workspace, or search term.

GET/v1/automations

Query Parameters

?page=1&limit=25&status=active&workspaceId=workspace_abc&search=pause

Filters: status, workspaceId, search (name substring).

Max limit: 100. Default: 25.

curl https://api.admanage.ai/v1/automations \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "Pause low ROAS ads",
      "status": "active",
      "actionType": "pause_ad",
      "accountId": "act_123456789",
      "frequency": "daily",
      "scheduledDate": "2026-02-27",
      "scheduledTime": "09:00",
      "workspaceId": "workspace_abc",
      "createdAt": "2026-02-20T10:00:00.000Z",
      "updatedAt": "2026-02-25T14:30:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 25,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Automation Rule

#

Fetch a single automation rule with its full flow configuration and 10 most recent executions.

GET/v1/automations/{id}
curl https://api.admanage.ai/v1/automations/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "id": 1,
    "name": "Pause low ROAS ads",
    "status": "active",
    "flow": {
      "nodes": [
        {
          "id": "trigger-1",
          "type": "trigger",
          "data": {}
        },
        {
          "id": "action-1",
          "type": "action",
          "data": {}
        }
      ]
    },
    "actionType": "pause_ad",
    "accountId": "act_123456789",
    "targetId": null,
    "newName": null,
    "frequency": "daily",
    "scheduledDate": "2026-02-27",
    "scheduledTime": "09:00",
    "dayOfWeek": null,
    "dayOfMonth": null,
    "startDate": null,
    "endDate": null,
    "workspaceId": "workspace_abc",
    "createdAt": "2026-02-20T10:00:00.000Z",
    "updatedAt": "2026-02-25T14:30:00.000Z",
    "executions": [
      {
        "id": 101,
        "status": "completed",
        "executedAt": "2026-02-26T09:00:05.000Z",
        "completedAt": "2026-02-26T09:00:12.000Z",
        "duration": 7000,
        "errorMessage": null
      }
    ]
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Create Automation Rule

#

Create a new automation rule. For recurring rules (daily/weekly/monthly), the scheduledDate is auto-calculated if not provided.

POST/v1/automations

Returns 201 Created.

Required: name, flow (with nodes array), actionType, accountId.

frequency: 'one-time' (default), 'daily', 'weekly', 'monthly'.

For weekly: provide dayOfWeek (e.g. 'monday').

For monthly: provide dayOfMonth (e.g. '15' or 'last').

curl https://api.admanage.ai/v1/automations \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "name": "Pause low ROAS ads",  "flow": {    "nodes": [      {        "id": "trigger-1",        "type": "trigger",        "data": {}      },      {        "id": "action-1",        "type": "action",        "data": {}      }    ]  },  "actionType": "pause_ad",  "accountId": "act_123456789",  "frequency": "daily",  "scheduledTime": "09:00",  "workspaceId": "workspace_abc"}'

Request Body

{
  "name": "Pause low ROAS ads",
  "flow": {
    "nodes": [
      {
        "id": "trigger-1",
        "type": "trigger",
        "data": {}
      },
      {
        "id": "action-1",
        "type": "action",
        "data": {}
      }
    ]
  },
  "actionType": "pause_ad",
  "accountId": "act_123456789",
  "frequency": "daily",
  "scheduledTime": "09:00",
  "workspaceId": "workspace_abc"
}

Response

{
  "success": true,
  "data": {
    "id": 2,
    "name": "Pause low ROAS ads",
    "status": "active",
    "flow": {
      "nodes": [
        {
          "id": "trigger-1",
          "type": "trigger",
          "data": {}
        },
        {
          "id": "action-1",
          "type": "action",
          "data": {}
        }
      ]
    },
    "actionType": "pause_ad",
    "accountId": "act_123456789",
    "frequency": "daily",
    "scheduledDate": "2026-02-27",
    "scheduledTime": "09:00",
    "workspaceId": "workspace_abc",
    "createdAt": "2026-02-27T15:00:00.000Z",
    "updatedAt": "2026-02-27T15:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Automation Rule

#

Partial update of an automation rule. scheduledDate is recalculated when frequency-related fields change.

PATCH/v1/automations/{id}

At least one field must be provided.

Updatable: name, flow, actionType, accountId, targetId, newName, status, frequency, scheduledDate, scheduledTime, dayOfWeek, dayOfMonth, startDate, endDate, workspaceId.

curl https://api.admanage.ai/v1/automations/{id} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "status": "paused"}'

Request Body

{
  "status": "paused"
}

Response

{
  "success": true,
  "data": {
    "id": 2,
    "name": "Pause low ROAS ads",
    "status": "paused",
    "frequency": "daily",
    "updatedAt": "2026-02-27T16:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Delete Automation Rule

#

Delete an automation rule. Company-scoped — only rules belonging to your company can be deleted.

DELETE/v1/automations/{id}
curl https://api.admanage.ai/v1/automations/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "message": "Rule 2 deleted"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Execute Automation Rule

#

Execute an existing saved automation rule by ID. Returns 202 Accepted with an executionId to poll for status.

POST/v1/automations/{id}/execute

Returns 202 Accepted — execution is asynchronous.

Poll GET /v1/automations/executions/{executionId} for final status.

curl https://api.admanage.ai/v1/automations/{id}/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Response

{
  "success": true,
  "data": {
    "executionId": 102,
    "status": "running",
    "message": "Poll GET /v1/automations/executions/102 for status."
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Execute Inline Automation

#

Execute an automation flow without saving it as a rule. Useful for one-off or CI-triggered executions.

POST/v1/automations/execute

Returns 202 Accepted — execution is asynchronous.

Required: flow (with nodes array), actionType, accountId.

dryRun: true simulates execution without making real changes.

curl https://api.admanage.ai/v1/automations/execute \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "flow": {    "nodes": [      {        "id": "action-1",        "type": "action",        "data": {}      }    ]  },  "actionType": "pause_ad",  "accountId": "act_123456789",  "dryRun": true}'

Request Body

{
  "flow": {
    "nodes": [
      {
        "id": "action-1",
        "type": "action",
        "data": {}
      }
    ]
  },
  "actionType": "pause_ad",
  "accountId": "act_123456789",
  "dryRun": true
}

Response

{
  "success": true,
  "data": {
    "executionId": 103,
    "status": "running",
    "message": "Poll GET /v1/automations/executions/103 for status."
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


List Automation Executions

#

Paginated list of automation execution history. Filterable by status, rule ID, and workspace.

GET/v1/automations/executions

Query Parameters

?page=1&limit=10&status=completed&automationRuleId=1

Filters: status, automationRuleId, workspaceId.

Status values: running, completed, failed, scheduled_delay, awaiting_approval.

curl https://api.admanage.ai/v1/automations/executions \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": [
    {
      "id": 101,
      "automationRuleId": 1,
      "name": "Pause low ROAS ads",
      "actionType": "pause_ad",
      "status": "completed",
      "executedAt": "2026-02-26T09:00:05.000Z",
      "completedAt": "2026-02-26T09:00:12.000Z",
      "duration": 7000,
      "errorMessage": null,
      "workspaceId": "workspace_abc"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 10,
    "total": 1,
    "totalPages": 1
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Automation Execution

#

Fetch full execution details including stepResults, executionLogs, flow snapshot, and any delayed execution or approval records.

GET/v1/automations/executions/{id}

Includes delayedExecution record when status is 'scheduled_delay'.

Includes approval record when status is 'awaiting_approval'.

curl https://api.admanage.ai/v1/automations/executions/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "id": 101,
    "automationRuleId": 1,
    "name": "Pause low ROAS ads",
    "actionType": "pause_ad",
    "accountId": "act_123456789",
    "flow": {
      "nodes": []
    },
    "status": "completed",
    "executedAt": "2026-02-26T09:00:05.000Z",
    "completedAt": "2026-02-26T09:00:12.000Z",
    "duration": 7000,
    "stepResults": [
      {
        "nodeId": "action-1",
        "status": "success",
        "result": {
          "adsPaused": 3
        }
      }
    ],
    "executionLogs": [
      "Evaluating trigger...",
      "Running action: pause_ad",
      "Paused 3 ads"
    ],
    "errorMessage": null,
    "delayedExecution": null,
    "approval": null
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Preview Automation Trigger

#

Preview which ads or ad sets would match an automation rule's trigger conditions. Useful for testing rules before activating them.

GET/v1/automations/preview-trigger

Query Parameters

?accountId=act_384730851257635&adSetFilterType=all&adStatusFilter=ACTIVE&criteria={"metric":"spend","operator":">","value":50,"lookbackDays":7}

accountId (required): ad account ID.

criteria: JSON object with metric, operator (>, >=, <, <=, =), value, and lookbackDays.

Supported metrics: spend, roas, cpm, cpc, ctr, impressions, conversions.

adSetFilterType: 'all', 'contains', or 'specific'.

adStatusFilter: 'all', 'ACTIVE', or 'PAUSED'.

curl https://api.admanage.ai/v1/automations/preview-trigger \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "data": {
    "matchedCount": 5,
    "results": [
      {
        "adSetId": "120248289622780456",
        "adSetName": "US Broad 25-44",
        "campaignId": "120247699100220456",
        "campaignName": "Q1 Prospecting",
        "spend": 120.5
      }
    ],
    "lookbackDays": 7,
    "totalProcessed": 42
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Google Sheets

#

Read Google Sheet

#

Read cell data from a Google Sheet. Returns headers and rows as structured JSON. Uses your connected Google Drive token automatically, with service account fallback.

GET/v1/sheets/read

Query Parameters

?url=https://docs.google.com/spreadsheets/d/1cy27K1nBMRvi6hL/edit&sheetName=Sheet1&range=A1:F50

url: Google Sheets URL or spreadsheet ID (required).

sheetName: tab name to read (default: first tab).

range: A1 notation range (default: all data).

Auth: uses connected Google Drive token first, falls back to service account.

Max 5000 rows returned per request.

availableTabs lists all tabs so you can read others.

curl https://api.admanage.ai/v1/sheets/read \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "spreadsheetId": "1cy27K1nBMRvi6hL",
  "sheetName": "Sheet1",
  "availableTabs": [
    "Sheet1",
    "Sheet2"
  ],
  "headers": [
    "Ad Name",
    "Media URLs",
    "Headline",
    "Primary Text",
    "CTA",
    "Link"
  ],
  "rows": [
    {
      "Ad Name": "Ad name 1",
      "Media URLs": "https://media.admanage.ai/Post~~H3~B.png",
      "Headline": "Get Admanage",
      "Primary Text": "The best thing I've ever seen",
      "CTA": "LEARN_MORE",
      "Link": "https://admanage.ai"
    }
  ],
  "totalRows": 1,
  "authMethod": "drive-oauth"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

YouTube

#

Upload Video to YouTube

#

Upload a video to YouTube from a URL. Useful for getting YouTube video IDs required by Google Ads campaigns.

POST/v1/youtube/upload-from-url

videoUrl (required): URL of the video to upload.

privacy: 'private' (default), 'public', or 'unlisted'.

Requires a connected YouTube/Google account.

curl https://api.admanage.ai/v1/youtube/upload-from-url \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "videoUrl": "https://media.admanage.ai/uploads/abc123/creative.mp4",  "title": "Product Demo - Q1 2026",  "description": "Our latest product demo video",  "privacy": "unlisted"}'

Request Body

{
  "videoUrl": "https://media.admanage.ai/uploads/abc123/creative.mp4",
  "title": "Product Demo - Q1 2026",
  "description": "Our latest product demo video",
  "privacy": "unlisted"
}

Response

{
  "success": true,
  "data": {
    "videoId": "dQw4w9WgXcQ",
    "title": "Product Demo - Q1 2026",
    "url": "https://youtube.com/watch?v=dQw4w9WgXcQ"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Changelog

#

List Changelog Entries

#

List published changelog entries in reverse chronological order. Returns the latest 20 entries. Auth via apiKey query parameter.

GET/api/external/crm

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter (not Bearer header).

Rate limited: 5 requests per second.

Only returns published entries.

curl https://admanage.ai/api/external/crm \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "entries": [
    {
      "id": 1,
      "title": "Faster Bulk Ad Uploads",
      "content": "Bulk uploads are now **3x faster** thanks to parallel processing.",
      "images": [],
      "category": "feature",
      "featured": true,
      "authorName": "AdManage Team",
      "authorEmail": "[email protected]",
      "published": true,
      "createdAt": "2026-03-19T12:00:00.000Z",
      "updatedAt": "2026-03-19T12:00:00.000Z"
    }
  ]
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Create Changelog Entry

#

Create a new changelog entry programmatically. Useful for CI/CD pipelines, ChatGPT integrations, or automated release notes.

POST/api/external/crm

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter (not Bearer header).

Rate limited: 5 requests per second.

Required fields: title, content, authorName, authorEmail.

Optional fields: images (string[] of URLs), category (daily_update | weekly_update | feature | fix | improvement | update), featured (boolean), published (boolean, defaults true), createdAt (ISO-8601 timestamp — optional on create to backfill display and sort order).

Category defaults to 'update' if not specified.

curl https://admanage.ai/api/external/crm \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "title": "Reddit Ads Integration",  "content": "Launch ads directly to Reddit from AdManage.\n\n- All ad types: link, video, image, carousel, freeform\n- Full OAuth flow with automatic token refresh\n- Budget and targeting controls",  "images": [],  "category": "feature",  "featured": false,  "published": true,  "authorName": "AdManage Team",  "authorEmail": "[email protected]",  "createdAt": "2026-03-18T12:00:00.000Z"}'

Request Body

{
  "title": "Reddit Ads Integration",
  "content": "Launch ads directly to Reddit from AdManage.\n\n- All ad types: link, video, image, carousel, freeform\n- Full OAuth flow with automatic token refresh\n- Budget and targeting controls",
  "images": [],
  "category": "feature",
  "featured": false,
  "published": true,
  "authorName": "AdManage Team",
  "authorEmail": "[email protected]",
  "createdAt": "2026-03-18T12:00:00.000Z"
}

Response

{
  "success": true,
  "entry": {
    "id": 42,
    "title": "Reddit Ads Integration",
    "content": "Launch ads directly to Reddit from AdManage.\n\n- All ad types: link, video, image, carousel, freeform\n- Full OAuth flow with automatic token refresh\n- Budget and targeting controls",
    "images": [],
    "category": "feature",
    "featured": false,
    "authorId": "external-api",
    "authorName": "AdManage Team",
    "authorEmail": "[email protected]",
    "published": true,
    "createdAt": "2026-03-18T12:00:00.000Z",
    "updatedAt": "2026-03-19T12:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Get Changelog Entry

#

Get a single changelog entry by ID.

GET/api/external/crm/{id}

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter.

Replace {id} with the entry's numeric ID.

curl https://admanage.ai/api/external/crm/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "entry": {
    "id": 42,
    "title": "Reddit Ads Integration",
    "content": "Launch ads directly to Reddit from AdManage.",
    "images": [],
    "category": "feature",
    "featured": true,
    "authorName": "AdManage Team",
    "published": true,
    "createdAt": "2026-03-19T12:00:00.000Z",
    "updatedAt": "2026-03-19T12:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Update Changelog Entry

#

Update an existing changelog entry. All fields are optional — only include the fields you want to change.

PATCH/api/external/crm/{id}

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter.

Replace {id} with the entry's numeric ID.

All fields are optional. Only send what you want to update.

Updatable fields: title, content, images, category, featured, published, authorName, authorEmail.

curl https://admanage.ai/api/external/crm/{id} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "title": "Updated Title",  "content": "Updated markdown content.",  "category": "improvement",  "featured": true}'

Request Body

{
  "title": "Updated Title",
  "content": "Updated markdown content.",
  "category": "improvement",
  "featured": true
}

Response

{
  "success": true,
  "entry": {
    "id": 42,
    "title": "Updated Title",
    "content": "Updated markdown content.",
    "images": [],
    "category": "improvement",
    "featured": true,
    "authorName": "AdManage Team",
    "published": true,
    "createdAt": "2026-03-19T12:00:00.000Z",
    "updatedAt": "2026-03-19T13:00:00.000Z"
  }
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Delete Changelog Entry

#

Permanently delete a changelog entry by ID.

DELETE/api/external/crm/{id}

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter.

Replace {id} with the entry's numeric ID.

This action is permanent and cannot be undone.

curl https://admanage.ai/api/external/crm/{id} \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "deleted": 42
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Generate Cover Image

#

Generate a professional cover image using AI (Google Gemini) and host it on the AdManage CDN. Returns a permanent URL you can use in the images array when creating or updating entries.

POST/api/external/crm/generate-image

Query Parameters

?apiKey=YOUR_CRM_API_KEY

Auth: Pass API key as ?apiKey=YOUR_KEY query parameter.

Rate limited: 2 requests per second.

The prompt describes the image to generate. Keep it concise (max 2000 chars).

Images are generated with no text/words, using a tech/SaaS aesthetic.

The returned URL is permanently hosted on the AdManage CDN (media.admanage.ai).

Use the URL in the images array when creating/updating changelog entries.

Workflow: 1) Generate image → 2) Create entry with the image URL in images array.

curl https://admanage.ai/api/external/crm/generate-image \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "prompt": "A cover image for a changelog about Reddit Ads integration with social media icons and purple gradients"}'

Request Body

{
  "prompt": "A cover image for a changelog about Reddit Ads integration with social media icons and purple gradients"
}

Response

{
  "success": true,
  "url": "https://media.admanage.ai/changelog/ai-1710864000000.jpg"
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.

Additional Channels

Remaining documented launch surfaces that are not yet first-class platform sections.

Launch Taboola Ads

#

Launch Taboola native ads via the API. Requires taboolaCampaignIds and taboolaCampaignNames (existing campaigns). Supports both video and image items.

POST/v1/launch

taboolaCampaignIds and taboolaCampaignNames are required (arrays). First element is used as the target campaign.

adSets should be an empty array [] — Taboola uses campaigns, not ad sets.

Supports video (.mp4) and image URLs. Videos are uploaded via direct upload with fallback thumbnails.

link is required — the destination URL for the native ad.

title is the headline shown in the Taboola feed (max ~60 characters for best performance).

curl https://api.admanage.ai/v1/launch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{  "ads": [    {      "adName": "Taboola API Ad",      "adAccountId": "taboolaaccount-cedadmanageai",      "adAccountType": "taboola",      "workspaceId": "cmhrv27io0001s4r4ouftfoly",      "title": "Taboola headline",      "description": "Taboola description",      "cta": "LEARN_MORE",      "link": "http://admanage.ai",      "taboolaCampaignIds": [        "48567616"      ],      "taboolaCampaignNames": [        "New Campaign_20260310"      ],      "adSets": [],      "media": [        {          "url": "https://media.admanage.ai/admanage.ai/234234ad_932200713WBIit8kT.mp4"        }      ]    }  ]}'

Request Body

{
  "ads": [
    {
      "adName": "Taboola API Ad",
      "adAccountId": "taboolaaccount-cedadmanageai",
      "adAccountType": "taboola",
      "workspaceId": "cmhrv27io0001s4r4ouftfoly",
      "title": "Taboola headline",
      "description": "Taboola description",
      "cta": "LEARN_MORE",
      "link": "http://admanage.ai",
      "taboolaCampaignIds": [
        "48567616"
      ],
      "taboolaCampaignNames": [
        "New Campaign_20260310"
      ],
      "adSets": [],
      "media": [
        {
          "url": "https://media.admanage.ai/admanage.ai/234234ad_932200713WBIit8kT.mp4"
        }
      ]
    }
  ]
}

Response

{
  "success": true,
  "message": "Ad launch initiated successfully",
  "adBatchSlug": "a1b2c3d4",
  "adBatchId": 12345,
  "isAsync": true
}

Interactive Request

Runs in your browser and shows the live response inline.

Sign in to run this endpoint from the docs.


Coming Soon

POST/v1/manage/edit/bulkEdit Existing Ad Creative
Admanage.ai

Product

  • Bulk Ad Launching
  • Creative Reporting
  • Meta Partnership Ads
  • AxonAppLovin / Axon Ads
  • TikTok Ads
  • Google Ads
  • Meta Ads
  • Snapchat Ads
  • Pinterest Ads
  • TaboolaTaboola Ads

Integrations

  • Google Drive
  • Dropbox
  • YouTube
  • Frame.io
  • Box
  • CanvaCanva
  • SharePointSharePoint
  • BrandfolderBrandfolder
  • AIRAIR
  • ShadeShade
  • IconikIconik

Tools

  • Meta Ad Preview Tool
  • AI Naming
  • First & Last Frame Extractor
  • Creative Calculator
  • ChatGPT Ad Templates
  • Facebook Emojis
  • Facebook Ad Cost Calculator
  • Google Sheets Plugin
  • Free Video Transcription
  • AI Ad Copy Generator

Resources

  • Blog
  • API Docs
  • MCP Server
  • Changelog
  • Case Studies
  • Brand Assets
  • AdManage Leaderboard
  • Support
  • Testimonials
  • Compare Platforms

Company

  • Support
  • Affiliates
  • Terms of service
  • Privacy policy
  • Pricing
  • Real-Time Status
  • Check live status
Built by AdManage.ai. © 2026 All rights reserved.