SMS Marketing Message Checker: STOP & 10DLC avatar

SMS Marketing Message Checker: STOP & 10DLC

Pricing

from $1.00 / 1,000 results

Go to Apify Store
SMS Marketing Message Checker: STOP & 10DLC

SMS Marketing Message Checker: STOP & 10DLC

Check SMS and MMS marketing texts before you send or register a 10DLC campaign: segment count and GSM-7 vs Unicode, STOP opt-out wording, opt-in confirmation elements, public URL shorteners, cannabis/CBD, SHAFT, high-risk finance, phishing-like wording, merge-field errors and 8am-9pm quiet hours.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Ultimate Foresight Inc

Ultimate Foresight Inc

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 hours ago

Last modified

Share

Check SMS and MMS marketing texts before you send them or submit a 10DLC campaign. The SMS Marketing Message Checker counts GSM-7 or Unicode segments (and finds the curly quote or dash that doubles your cost), and flags missing STOP opt-out wording, opt-in confirmations without HELP, frequency or "msg & data rates", bit.ly and other public URL shorteners, http links, no brand name, cannabis, CBD, gambling, high-risk loans and SHAFT content, phishing-like wording, unfilled {{placeholders}}, all caps and spam phrases and sends outside 8 a.m.-9 p.m.. Each finding links to the CTIA, Twilio or FCC source. Click Start with the prefilled example to see it work.

This is a pre-send screen against public CTIA guidance, carrier filtering error descriptions and the federal TCPA time window. It doesn't guarantee delivery or campaign approval, and it isn't legal advice on consent, which it can't see. Every row carries this disclaimer.

What does the SMS Marketing Message Checker do?

  • ✅ Segments and cost: encoding (GSM-7 or UCS-2), characters, billed segments (160/153 or 70/67), and segmentsIfFixed when smart quotes, en dashes or similar characters force Unicode.
  • ✅ Opt-out: no STOP wording (high for first messages and opt-in confirmations).
  • ✅ Opt-in confirmations: missing program name, HELP, message frequency or "msg & data rates may apply", as CTIA lists for confirmation messages.
  • ✅ Links: public URL shorteners (bit.ly, tinyurl and others), http:// links and many links in one message.
  • ✅ Content carriers restrict: cannabis and CBD, high-risk lending and debt relief, gambling, SHAFT (sex, hate, alcohol, firearms, tobacco), third-party lead generation and phishing-like account warnings.
  • ✅ Format and timing: brand not named, unfilled {{first_name}} placeholders, mostly caps, spam phrases and marketing sends before 8 a.m. or from 9 p.m. recipient time.
  • ✅ Output per message: riskLevel, issueCount, categoriesFlagged, encoding, characters, encodedUnits, segments, nonGsmCharacters, issues (ruleId, category, severity, quote, sourceUrl, fixHint), checkedAt and a disclaimer.

Who is it for?

  • Small businesses and ecommerce stores writing their own SMS campaigns.
  • Agencies and SMS platform users checking templates before 10DLC campaign registration.
  • Developers adding a pre-send check to Twilio, Klaviyo, Attentive or Postscript workflows.
  • Compliance and QA teams reviewing campaign libraries in bulk.

How to check SMS marketing messages

  1. Click Start with the prefilled example (two promos with problems, a weak opt-in confirmation and a good one).
  2. Replace it with your messages: plain texts, or objects with text, id, messageType (marketing, optInConfirmation, transactional), brand and sendTime or sendHourLocal.
  3. Set Brand to check every message names you, and Send hour to check the quiet-hours window.
  4. Or enter a Dataset ID with exported campaign texts; use Field map for the text field.
  5. Turn on Only save rows with findings; you only pay for saved messages.

Input example

This is the prefilled input:

{
"messages": [
{
"id": "promo-1",
"text": "FLASH SALE!!! 40% off everything today only – shop now: bit.ly/3xAmPle",
"brand": "Example Shoes"
},
{
"id": "welcome-1",
"messageType": "optInConfirmation",
"brand": "Example Shoes",
"text": "Example Shoes: Thanks for joining! Reply STOP to cancel."
},
{
"id": "promo-2",
"text": "Example Shoes: Hi {{first_name}}, your account has been suspended. Verify your account at http://example-shoes-help.com",
"brand": "Example Shoes"
},
{
"id": "welcome-2",
"messageType": "optInConfirmation",
"brand": "Example Shoes",
"text": "Example Shoes: You're signed up for sale alerts. Up to 4 msgs/mo. Msg & data rates may apply. Reply HELP for help, STOP to cancel."
}
]
}

Dataset mode:

{"datasetId": "YOUR_DATASET_ID", "fieldMap": {"text": "body", "id": "campaignId"}, "brand": "Your Brand", "onlyFlagged": true}

Output example

Real output from a run of the prefilled input on 2026-10-30 (long finding lists are shortened here; the run returns all of them):

[
{
"itemNo": 1,
"messageId": "promo-1",
"text": "FLASH SALE!!! 40% off everything today only – shop now: bit.ly/3xAmPle",
"messageType": "marketing",
"encoding": "UCS-2",
"characters": 70,
"encodedUnits": 70,
"segments": 1,
"nonGsmCharacters": "–",
"riskLevel": "high",
"issueCount": 5,
"categoriesFlagged": [
"Links",
"Opt-out",
"Segments and cost",
"Sender identification",
"Spam signals"
],
"issues": [
{
"ruleId": "public_url_shortener",
"category": "Links",
"severity": "high",
"quote": "bit.ly/3xAmPle",
"sourceUrl": "https://www.twilio.com/docs/api/errors/30963",
"fixHint": "Public URL shorteners (bit.ly, tinyurl, t.co and similar) hide the destination and get campaigns rejected and messages filtered. Use your full domain or a branded short domain you own."
},
{
"ruleId": "missing_opt_out",
"category": "Opt-out",
"severity": "medium",
"quote": null,
"sourceUrl": "https://api.ctia.org/wp-content/uploads/2023/05/230523-CTIA-Messaging-Principles-and-Best-Practices-FINAL.pdf",
"fixHint": "No opt-out instructions found. CTIA asks senders to state how and with which words to opt out, using standard STOP wording (e.g., 'Reply STOP to opt out')."
},
{
"...": "3 more findings: brand_not_named 'Example Shoes', unicode_from_punctuation '–', spam_phrases '!!!'"
}
],
"checkedAt": "2026-10-30T18:52:09+00:00",
"disclaimer": "Automated text pre-check based on public CTIA Messaging Principles, Twilio/carrier..."
},
{
"itemNo": 2,
"messageId": "welcome-1",
"text": "Example Shoes: Thanks for joining! Reply STOP to cancel.",
"messageType": "optInConfirmation",
"encoding": "GSM-7",
"characters": 56,
"encodedUnits": 56,
"segments": 1,
"nonGsmCharacters": null,
"riskLevel": "medium",
"issueCount": 3,
"categoriesFlagged": [
"Opt-in confirmation"
],
"issues": [
{
"ruleId": "optin_missing_help",
"category": "Opt-in confirmation",
"severity": "medium",
"quote": null,
"sourceUrl": "https://api.ctia.org/wp-content/uploads/2023/05/230523-CTIA-Messaging-Principles-and-Best-Practices-FINAL.pdf",
"fixHint": "Opt-in confirmations should include customer-care contact info or HELP instructions (CTIA 5.1.2.1)."
},
{
"ruleId": "optin_missing_rates",
"category": "Opt-in confirmation",
"severity": "medium",
"quote": null,
"sourceUrl": "https://api.ctia.org/wp-content/uploads/2023/05/230523-CTIA-Messaging-Principles-and-Best-Practices-FINAL.pdf",
"fixHint": "Opt-in confirmations should disclose fees, typically 'Msg & data rates may apply' (CTIA 5.1.2.1)."
},
{
"...": "1 more findings: optin_missing_frequency ''"
}
],
"checkedAt": "2026-10-30T18:52:09+00:00",
"disclaimer": "Automated text pre-check based on public CTIA Messaging Principles, Twilio/carrier..."
},
{
"itemNo": 3,
"messageId": "promo-2",
"text": "Example Shoes: Hi {{first_name}}, your account has been suspended. Verify your account at http://example-shoes-help.com",
"messageType": "marketing",
"encoding": "GSM-7",
"characters": 119,
"encodedUnits": 123,
"segments": 1,
"nonGsmCharacters": null,
"riskLevel": "high",
"issueCount": 4,
"categoriesFlagged": [
"Deceptive / phishing-like wording",
"Format",
"Links",
"Opt-out"
],
"issues": [
{
"ruleId": "phishing_like",
"category": "Deceptive / phishing-like wording",
"severity": "high",
"quote": "your account has been suspended",
"sourceUrl": "https://api.ctia.org/wp-content/uploads/2023/05/230523-CTIA-Messaging-Principles-and-Best-Practices-FINAL.pdf",
"fixHint": "Wording common in phishing (account suspended, verify your account, unusual activity, package held, prize claims) gets messages filtered and CTIA lists deceptive or phishing content as unwanted. Rephrase and make the sender obvious."
},
{
"ruleId": "missing_opt_out",
"category": "Opt-out",
"severity": "medium",
"quote": null,
"sourceUrl": "https://api.ctia.org/wp-content/uploads/2023/05/230523-CTIA-Messaging-Principles-and-Best-Practices-FINAL.pdf",
"fixHint": "No opt-out instructions found. CTIA asks senders to state how and with which words to opt out, using standard STOP wording (e.g., 'Reply STOP to opt out')."
},
{
"...": "2 more findings: unfilled_placeholder '{{first_name}}', insecure_link 'http://example-shoes-help.com'"
}
],
"checkedAt": "2026-10-30T18:52:09+00:00",
"disclaimer": "Automated text pre-check based on public CTIA Messaging Principles, Twilio/carrier..."
},
{
"itemNo": 4,
"messageId": "welcome-2",
"text": "Example Shoes: You're signed up for sale alerts. Up to 4 msgs/mo. Msg & data rates may apply. Reply HELP for help, STOP to cancel.",
"messageType": "optInConfirmation",
"encoding": "GSM-7",
"characters": 130,
"encodedUnits": 130,
"segments": 1,
"nonGsmCharacters": null,
"riskLevel": "none found",
"issueCount": 0,
"categoriesFlagged": [],
"issues": [],
"checkedAt": "2026-10-30T18:52:09+00:00",
"disclaimer": "Automated text pre-check based on public CTIA Messaging Principles, Twilio/carrier..."
}
]

How much does it cost to check SMS messages?

This Actor uses pay-per-event pricing: $0.001 per message saved plus a $0.00005 start fee per run, plus small platform usage paid by you (a few hundredths of a cent for small runs). That's about $0.10 for 100 messages and $1 for 1,000 messages plus usage. With Only save rows with findings on, clean messages aren't saved or charged. You can set a maximum cost per run in the run options.

Use it through the API, integrations or AI agents

  • Run it and get results in one call: https://api.apify.com/v2/acts/ultimatemc~sms-marketing-message-checker/run-sync-get-dataset-items
  • Use it from AI agents through the Apify MCP server: https://mcp.apify.com?tools=ultimatemc/sms-marketing-message-checker
  • Call it from your sending workflow before each campaign, or connect it to Make, Zapier, n8n or Google Sheets.

How it works

All checks are deterministic: GSM-7 character tables for encoding and segments, and English text patterns written from the CTIA Messaging Principles and Best Practices (May 2023), Twilio's carrier filtering error pages and messaging policy, and 47 CFR 64.1200, checked on 2026-10-30. No AI, no outside calls and no messages are sent. The risk level is the highest severity found.

Sources:

FAQ

Does a clean result mean carriers will deliver my message?

No. Carriers also look at your registration, sending patterns and complaints. A clean result means none of the listed text problems were found.

No. It can't see how you collected opt-ins. You're responsible for consent under the TCPA and carrier rules.

Why is my short message 2 segments?

One character outside GSM-7, like a curly quote or an en dash, switches the whole message to Unicode with a 70-character limit. The output shows those characters and segmentsIfFixed.

Why are transactional messages not flagged for STOP?

Set messageType to transactional; opt-out and quiet-hours checks are skipped for those. Other checks still run.

Is it AI?

No. It's a fixed rule set, so results are repeatable and runs cost $0.001 per message.

Limitations

  • English messages and US carrier rules only.
  • State quiet-hours laws (some stricter than 8 a.m.-9 p.m.) aren't checked.
  • MMS media isn't checked, only the text.
  • Guidance as of 2026-10-30; carriers change filtering without notice.

Other tools by Ultimate Foresight

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