# Ad Copy Policy Checker for Meta, Google & TikTok (`ultimatemc/ad-copy-policy-checker`) Actor

Check ad copy against Meta (Facebook & Instagram), Google Ads and TikTok ad policies before you submit. Flags personal attributes, health and weight-loss claims, financial guarantees, crypto, gambling, alcohol, clickbait and caps, with severity per platform, the exact words, a policy link and a fix.

- **URL**: https://apify.com/ultimatemc/ad-copy-policy-checker.md
- **Developed by:** [Ultimate Foresight Inc](https://apify.com/ultimatemc) (community)
- **Categories:** Marketing, Social media, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $30.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Ad Copy Policy Checker** scans your ad headlines and text against rules built from the public **Meta (Facebook & Instagram), Google Ads and TikTok advertising policies**, before you submit. For every ad you get the risk level per platform, the exact words that triggered each flag, a link to the policy page it is based on, and a plain-English fix. Paste your ads or send them in bulk through the API. Click **Start** with the prefilled example to see a result in a few seconds.

> **A pre-check, not an approval.** This is a fixed, rule-based checker. A flag means "review this"; a clean result does **not** guarantee approval. Platforms also review images, video, landing pages, targeting and account history, and their policies change. Not legal advice.

### What does Ad Copy Policy Checker do?

- ✅ Checks ad copy against **24 content rules** (personal attributes, health and weight-loss claims, before/after, financial guarantees, loans, crypto, gambling, alcohol, tobacco, drugs and CBD, weapons, adult and dating, profanity, clickbait, fake endorsements, absolute claims, political content, discriminatory wording, exploiting crises)
- ✅ Runs **Google Ads editorial checks**: EXCESSIVE CAPS, "!!", "F R E E", "$ave", 3+ emoji, repetition, phone numbers in ad text
- ✅ Checks **landing URLs**: shorteners, non-HTTPS, invalid URLs. Optionally fetches the page to catch 404s and other errors (Google "Destination not working") and scans the page text with the same rules
- ✅ Gives a **severity per platform** (Meta, Google Ads, TikTok), the quoted words, the policy URL and a suggested fix for every flag
- ✅ Works in bulk: paste many ads at once or send a list through the API; export results as JSON, CSV or Excel
- ✅ Rule-based and repeatable: the same text always gets the same result. An optional extra AI review with **your own** OpenAI-compatible key is off by default

### Who is it for?

- 📣 **Performance marketers and media buyers** who want to catch risky wording before an ad is rejected or an account gets flagged
- 🏢 **Agencies** checking client copy at scale before launch
- ✍️ **Copywriters and AI ad generators** that need an automated policy gate in their pipeline
- 🛒 **E-commerce, health, finance and supplement brands**, where rules are strictest

### How to check ad copy for policy issues

1. Click **Try for free** or **Start**. The input is prefilled with two example ads.
2. Replace them with your own ad texts, one per line in **Ad texts**. For headlines, landing URLs or per-ad platforms, use **Ads (advanced)**.
3. Pick the platforms to check (Meta, Google Ads, TikTok).
4. Click **Start**. Each ad becomes one row in the results table.
5. Download the results as JSON, CSV or Excel, or fetch them through the API.

### Input example

Simple mode (this is the prefilled input):

```json
{
  "adTexts": [
    "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
    "Handmade leather wallets. Free shipping on orders over $50."
  ]
}
```

Advanced mode, with headline, platform and landing URL per ad:

```json
{
  "ads": [
    {
      "id": "g1",
      "headline": "FREE SHIPPING TODAY",
      "text": "Guaranteed returns of 5% daily. Call 555-123-4567",
      "platform": "google",
      "landingUrl": "http://bit.ly/x"
    }
  ],
  "platforms": [
    "meta",
    "google",
    "tiktok"
  ],
  "fetchLandingPage": false
}
```

### Output example

This is real output from the prefilled input above (run on 2026-10-21). Two of the four issues on the first ad are shown in full; the rest are summarized.

```json
[
  {
    "adId": 1,
    "headline": null,
    "text": "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
    "platformsChecked": [
      "meta",
      "google",
      "tiktok"
    ],
    "riskLevel": "high",
    "riskByPlatform": {
      "meta": "high",
      "google": "medium",
      "tiktok": "high"
    },
    "issueCount": 4,
    "issues": [
      {
        "ruleId": "personal_attributes",
        "category": "Personal attributes",
        "severity": "high",
        "field": "text",
        "quote": "Are you overweight",
        "context": "Are you overweight? Lose 30 lbs in 30 days without dieting...",
        "platforms": [
          {
            "platform": "meta",
            "severity": "high",
            "policyUrl": "https://transparency.meta.com/policies/ad-standards/objectionable-content/privacy-violations-personal-attributes/"
          },
          {
            "platform": "google",
            "severity": "low",
            "policyUrl": "https://support.google.com/adspolicy/answer/143465"
          }
        ],
        "suggestion": "Don't assert or imply the viewer has a personal attribute (health, finances, religion, age, race, sexual orientation...). Describe the product instead, e.g. 'A support group for people managing diabetes' rather than 'Are you diabetic?'.",
        "source": "rules"
      },
      {
        "ruleId": "weight_loss_claims",
        "category": "Weight-loss / muscle-gain claims",
        "severity": "high",
        "field": "text",
        "quote": "Lose 30 lbs",
        "context": "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
        "platforms": [
          {
            "platform": "meta",
            "severity": "high",
            "policyUrl": "https://transparency.meta.com/policies/ad-standards/restricted-goods-services/health-wellness/"
          },
          {
            "platform": "google",
            "severity": "medium",
            "policyUrl": "https://support.google.com/adspolicy/answer/6020955"
          },
          {
            "platform": "tiktok",
            "severity": "high",
            "policyUrl": "https://ads.tiktok.com/help/article/tiktok-ads-policy-weight-management"
          }
        ],
        "suggestion": "Remove specific or fast weight/muscle results and 'no diet/exercise' promises. Prescription weight-loss drugs (GLP-1) need platform authorization. Target 18+ and frame around a healthy lifestyle.",
        "source": "rules"
      },
      {
        "...": "2 more issues (weight_loss_claims: 'without dieting', excessive_punctuation: '!!')"
      }
    ],
    "landingUrl": null,
    "disclaimer": "Automated pre-check based on public ad policies. Flags are possible issues, not decisions; a clean result does not guarantee approval. Platforms review images, video, landing pages, targeting and account history, which this tool does not fully see."
  },
  {
    "adId": 2,
    "headline": null,
    "text": "Handmade leather wallets. Free shipping on orders over $50.",
    "platformsChecked": [
      "meta",
      "google",
      "tiktok"
    ],
    "riskLevel": "none found",
    "riskByPlatform": {
      "meta": "none found",
      "google": "none found",
      "tiktok": "none found"
    },
    "issueCount": 0,
    "issues": [],
    "landingUrl": null,
    "disclaimer": "Automated pre-check based on public ad policies. Flags are possible issues, not decisions; a clean result does not guarantee approval. Platforms review images, video, landing pages, targeting and account history, which this tool does not fully see."
  }
]
```

**Severity:** `high` = commonly prohibited or likely to be rejected. `medium` = restricted: needs authorization, certification, age or location targeting, or disclaimers. `low` = style issue or weak signal. `riskLevel` is the highest severity found; `none found` means no rule matched.

### How much does it cost to check ad copy?

This Actor uses **pay-per-event** pricing:

- **$0.03 per ad checked** (one result row per ad)
- a tiny Actor start fee of **$0.00005** per run
- plus the small Apify **platform usage** of the run, paid by you. For the prefilled 2-ad example this was about **$0.0001** (256 MB, about 3 seconds).

So **100 ads cost about $3.00** and **1,000 ads about $30**, plus a few cents or less of platform usage. You pay only for ads actually checked. Apify lets you set a maximum cost per run so a large batch can never exceed your budget.

### Use it through the API, integrations or AI agents

- **API:** run it and get results in one call:
  `POST https://api.apify.com/v2/acts/ultimatemc~ad-copy-policy-checker/run-sync-get-dataset-items` with your Apify token and the input JSON as the body. Client libraries for JavaScript and Python are on the **API** tab.
- **AI agents (MCP):** add `https://mcp.apify.com?tools=ultimatemc/ad-copy-policy-checker` to Claude, Cursor, ChatGPT or any MCP client, and your agent can check ad copy as a tool before publishing. See [Apify MCP server](https://docs.apify.com/mcp).
- **Automation:** schedule runs, trigger webhooks, or connect Make, Zapier, n8n, Google Sheets and other integrations from Apify Console.

### Policy pages behind each rule

Every rule links to the public page it is based on. The rules are our own paraphrased patterns; no policy text is copied. Pages checked on 2026-10-20.

| Rule area | Policy pages |
|---|---|
| Personal attributes | [Meta](https://transparency.meta.com/policies/ad-standards/objectionable-content/privacy-violations-personal-attributes/), [Google Ads](https://support.google.com/adspolicy/answer/143465) |
| Negative self-perception / body image | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/health-wellness/), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-weight-management) |
| Weight-loss / muscle-gain claims | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/health-wellness/), [Google Ads](https://support.google.com/adspolicy/answer/6020955), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-weight-management) |
| Before-and-after claims | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/health-wellness/), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-misleading-and-false-content) |
| Health & medical claims | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/drugs-pharmaceuticals/), [Google Ads](https://support.google.com/adspolicy/answer/176031), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-misleading-and-false-content) |
| Financial guarantees / get-rich-quick | [Meta](https://transparency.meta.com/policies/ad-standards/deceptive-content/prohibited-commercial-practices/), [Google Ads](https://support.google.com/adspolicy/answer/6020955), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-financial-services) |
| Loans, credit & debt services | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/financial-services/), [Google Ads](https://support.google.com/adspolicy/answer/2464998), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-financial-services) |
| Cryptocurrency | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/cryptocurrency-products-and-services/), [Google Ads](https://support.google.com/adspolicy/answer/2464998), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-financial-services) |
| Gambling & games of chance | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/gambling-games/), [Google Ads](https://support.google.com/adspolicy/answer/15132179), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-gambling-and-games) |
| Alcohol | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/alcohol/), [Google Ads](https://support.google.com/adspolicy/answer/6012382), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-alcohol) |
| Alcohol - irresponsible drinking | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/alcohol/), [Google Ads](https://support.google.com/adspolicy/answer/6012382), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-alcohol) |
| Tobacco, vapes & nicotine | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/tobacco-related-products/), [Google Ads](https://support.google.com/adspolicy/answer/6014299), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| Drugs, cannabis & unsafe substances | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/drugs-pharmaceuticals/), [Google Ads](https://support.google.com/adspolicy/answer/6014299), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| CBD / hemp | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/drugs-pharmaceuticals/), [Google Ads](https://support.google.com/adspolicy/answer/176031), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| Weapons, ammunition & explosives | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/weapons-ammunitions-explosives/), [Google Ads](https://support.google.com/adspolicy/answer/6014299), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| Adult / sexual content | [Meta](https://transparency.meta.com/policies/ad-standards/objectionable-content/adult-sexual-solicitation-and-sexually-explicit-language/), [Google Ads](https://support.google.com/adspolicy/answer/6023699), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| Dating services | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/dating-ads/), [Google Ads](https://support.google.com/adspolicy/answer/6023699), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-other-products-and-services) |
| Profanity | [Meta](https://transparency.meta.com/policies/ad-standards/objectionable-content/profanity/), [Google Ads](https://support.google.com/adspolicy/answer/6015406) |
| Sensational / clickbait language | [Meta](https://transparency.meta.com/policies/ad-standards/deceptive-content/prohibited-commercial-practices/), [Google Ads](https://support.google.com/adspolicy/answer/6020955), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-misleading-and-false-content) |
| Celebrity / unauthorized endorsement | [Meta](https://transparency.meta.com/policies/ad-standards/deceptive-content/prohibited-commercial-practices/), [Google Ads](https://support.google.com/adspolicy/answer/6020955), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-misleading-and-false-content) |
| Unsubstantiated absolute / superlative claims | [Google Ads](https://support.google.com/adspolicy/answer/6020955), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-misleading-and-false-content) |
| Political, election & social-issue content | [Meta](https://www.facebook.com/business/help/167836590566506), [Google Ads](https://support.google.com/adspolicy/answer/6014595), [TikTok](https://ads.tiktok.com/help/article/tiktok-ads-policy-politics-government-and-elections) |
| Discriminatory practices (housing, jobs, credit) | [Meta](https://transparency.meta.com/policies/ad-standards/unacceptable-content/discriminatory-practices/), [Google Ads](https://support.google.com/adspolicy/answer/143465) |
| Exploiting crises / controversial events | [Meta](https://transparency.meta.com/policies/ad-standards/restricted-goods-services/commercial-exploitation-of-crises-and-controversial-events/), [Google Ads](https://support.google.com/adspolicy/answer/6015406) |
| Editorial: caps, punctuation, spacing, symbols, emoji, repetition, phone number | [Google Ads](https://support.google.com/adspolicy/answer/6021546) |
| Landing page not working | [Google Ads](https://support.google.com/adspolicy/answer/6368661) |

### FAQ

#### Will a clean result guarantee my ad is approved?

No. A clean result means none of the rules matched the text. Meta, Google and TikTok also review images, video, landing pages, targeting and account history, and make the final decision.

#### Does it use AI?

Not by default. The core checker is rule-based (keywords and patterns), so results are repeatable and every flag has a policy link. If you turn on **Optional AI review** and add your own OpenAI-compatible API key, each ad is also sent to that provider and billed by them; those findings are marked `source: "llm"` and have no policy link. This option has not been tested by us with a live key.

#### Which languages are supported?

English only.

#### Is my ad copy stored?

Ad text is processed during the run and saved only to your own Apify dataset. No personal data is collected.

#### Can it check images or videos?

No. It reads text and, optionally, the visible text of your landing page.

### Limitations

- Keyword and pattern matching can't fully read context. Words like "shot" or "spirits" may be flagged or missed, and sarcasm isn't understood.
- It does not see images, video, audio, targeting or account status, which are frequent causes of rejection.
- Policies vary by country and change often. Always check the linked policy page.
- Landing-page scan (off by default) makes one plain HTTP request per URL; pages that need a browser or block bots may not be scanned.

### Other tools by Ultimate Foresight

- [H-1B Visa Sponsor Checker & Score](https://apify.com/ultimatemc/h1b-visa-sponsor-score): adds Department of Labor H-1B sponsorship history and a 0-100 score to company names or job listings.
- [Chain vs Independent Labeler for Google Maps Leads](https://apify.com/ultimatemc/chain-vs-independent-labeler): labels local businesses as chain, franchise or independent.

Found a false positive or a missed phrase? Open an issue on the **Issues** tab with the ad text, and we'll review the rule.

# Actor input Schema

## `adTexts` (type: `array`):

One ad per line. Prefilled with two examples so you can click Start right away; replace them with your own copy. For headlines, landing URLs or per-ad platforms, use 'Ads (advanced)'.

## `ads` (type: `array`):

Array of objects: {"id": "a1", "headline": "...", "text": "...", "platform": "meta"|"google"|"tiktok" (or a list), "landingUrl": "https://..."}

## `platforms` (type: `array`):

Default platforms to check when an ad doesn't specify one.

## `fetchLandingPage` (type: `boolean`):

If on, downloads each landingUrl (one plain HTTP request, no browser) and runs the same content rules on its visible text.

## `maxAds` (type: `integer`):

Maximum number of ads to check in this run.

## `enableLlmReview` (type: `boolean`):

Off by default. If on and a key is given, each ad is also sent to an OpenAI-compatible chat API using YOUR key and billed by that provider. AI findings are marked source=llm and have no policy link.

## `llmApiKey` (type: `string`):

Your OpenAI-compatible API key. Stored as a secret.

## `llmBaseUrl` (type: `string`):

OpenAI-compatible base URL.

## `llmModel` (type: `string`):

Model name.

## Actor input object example

```json
{
  "adTexts": [
    "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
    "Handmade leather wallets. Free shipping on orders over $50."
  ],
  "ads": [
    {
      "id": "a1",
      "headline": "Guaranteed returns",
      "text": "Earn 5% daily, risk-free",
      "platform": "meta",
      "landingUrl": "https://example.com"
    }
  ],
  "platforms": [
    "meta",
    "google",
    "tiktok"
  ],
  "fetchLandingPage": false,
  "maxAds": 1000,
  "enableLlmReview": false,
  "llmBaseUrl": "https://api.openai.com/v1",
  "llmModel": "gpt-4o-mini"
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "adTexts": [
        "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
        "Handmade leather wallets. Free shipping on orders over $50."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ultimatemc/ad-copy-policy-checker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "adTexts": [
        "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
        "Handmade leather wallets. Free shipping on orders over $50.",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("ultimatemc/ad-copy-policy-checker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "adTexts": [
    "Are you overweight? Lose 30 lbs in 30 days without dieting!!",
    "Handmade leather wallets. Free shipping on orders over $50."
  ]
}' |
apify call ultimatemc/ad-copy-policy-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ultimatemc/ad-copy-policy-checker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/r9rHVYDSMmAij9yIO/builds/DnDInaqn1Zt9xj1Ed/openapi.json
