PreCheck - 10DLC

Rapid checks for SMS 10DLC Brand and Message Campaign Compliance

Introduction and Use Cases

Use the 10DLC PreCheck API to run KYC/KYB and compliance analyses on brand and 10DLC messaging campaign information. The API returns results within minutes so you can find compliance issues before formal review. Treat PreCheck results as guidance, not a guarantee of approval or rejection, because carriers, aggregators, and verification authorities each run their own review processes.

Different entities can use these APIs at different points in the Campaign Launch lifecycle:

  • CSPs / Texting Platforms

    • Catch potential launch issues before submitting to aggregators for onboarding

    • Reduce time to launch and internal review overhead

  • Aggregators

    • Run pre-flight checks before submitting to DCAs (if applicable), verification authorities, and carriers

    • Automate carrier-expected campaign compliance checks


API Workflow

At a high level, the workflow for a single PreCheck looks like this:

1. Client sends a PreCheck request

  • POST with JSON body containing brand, agent, and messaging details

  • Specify which analysisSteps to run

  • Include a callbackUrl where results should be delivered

Example 10DLC Request Payload

This example utilizes standard 10DLC parameters, featuring a retail marketing use case scenario complete with an EIN, 10DLC vertical declaration, and sub-use cases.

{
  "externalProjectId": "crm-10dlc-acme-retail",
  "callbackUrl": "https://api.yourplatform.com/v1/webhooks/texter-precheck",
  "analysisSteps": [
    "brand_background_check",
    "brand_online_presence_check",
    "poc_email_domain_check",
    "privacy_policy_check",
    "terms_of_service_check",
    "opt_in_method_check",
    "opt_in_message_check",
    "opt_out_message_check",
    "help_message_check",
    "campaign_description_check",
    "sample_messages_check",
    "use_case_consistency_check",
    "shaft_content_check",
    "prohibited_use_case_check"
  ],
  "legalName": "Acme Retail Group LLC",
  "dbaName": "Acme Boutique",
  "businessIdentifier": "98-7654321",
  "registeredBusinessAddress": "789 Broadway St, New York, NY 10003",
  "businessWebsiteUrl": "https://www.acme-boutique-example.com",
  "brandPocEmail": "[email protected]",
  "brandVerticalType": "RETAIL",
  "privacyPolicyUrl": "https://www.acme-boutique-example.com/privacy",
  "termsOfServiceUrl": "https://www.acme-boutique-example.com/terms",
  "ageGated": false,
  "optInMethods": [
    "WEB_FORM"
  ],
  "optInMethodURLs": [
    "https://www.acme-boutique-example.com/join-club"
  ],
  "optInDescription": "Customers explicitly opt-in via a standalone checkbox on our checkout and loyalty club enrollment web forms.",
  "optInKeywords": [
    "START"
  ],
  "optInMessage": "Acme Boutique: Thank you for joining! Reply YES to opt in for exclusive style drops & sales. Freq max 4/mo. Msg&Data rates may apply. Reply STOP to cancel, HELP for help.",
  "optOutKeywords": [
    "STOP"
  ],
  "optOutMessage": "Acme Boutique: You have been successfully opted out. You will no longer receive marketing text messages from us.",
  "helpKeywords": [
    "HELP"
  ],
  "helpMessage": "Acme Boutique: For customer support, reply to this thread, email [email protected], or call 1-800-555-0144. Freq varies. Msg&Data rates may apply.",
  "campaignDescription": "This campaign sends personalized promotional alerts, weekly discount codes, and invitations to exclusive shopping events to our opted-in loyalty club members.",
  "useCase": "MARKETING",
  "subUseCases": [
    "PROMOTIONAL_ALERTS"
  ],
  "directLending": false,
  "affiliateMarketing": false,
  "embeddedLink": "https://acme-boutique-example.com/discount",
  "embeddedPhone": "+18005550144",
  "sampleMessages": [
    {
      "content": "Acme Boutique: VIP Alert! Use code STYLE20 for 20% off your next online order. Shop now at https://acme-boutique-example.com/discount. Reply STOP to unsubscribe.",
      "useCase": "PROMOTIONAL_ALERTS"
    }
  ]
}

2. Synchronous validation

  • The API validates the request immediately.

  • On success, the API returns:

    • projectId (TexterID project ID. Each PreCheck API call creates a new projectId.)

    • projectUrl (TexterID dashboard link. Open this page to view analysis results in real time.)

    • analysisId (Specific ID for the analysis run.)

  • If synchronous validation fails, the API returns a 4xx with issue details.

Example 200 OK Synchronous Success Response

Returned instantly when the 10DLC structural validations pass and the payload is successfully queued for parallel compliance processing.

{
  "projectId": "proj_10dlc_7f9a2b4c",
  "projectUrl": "https://dashboard.texterid.com/projects/proj_10dlc_7f9a2b4c",
  "analysisId": "analysis_10dlc_8d3e2f1a"
}
❗️

Potential validation issues include:

  • Invalid analysis steps provided or missing prerequisites

  • Missing required fields for an analysis step.

Example 400 Bad Request Synchronous Failure Response

Returned immediately if mandatory fields required for your selected 10DLC processing steps are missing or there is an issue with the request.

{
  "errorCode": "VALIDATION_FAILED",
  "errorMessage": "Synchronous payload check failed. Missing mandatory context fields required for your requested 10DLC analysis steps.",
  "details": [
    {
      "issue": "The field 'businessIdentifier' (EIN) is required and must be formatted as XX-XXXXXXX when running 'brand_background_check'."
    },
    {
      "issue": "The field 'brandVerticalType' must be populated with a valid 10DLC vertical registration classification when running 'prohibited_use_case_check'."
    }
  ]
}

3. Asynchronous analysis

  • The API runs the requested analysisSteps in parallel after any prerequisite steps complete.

  • The API sends a webhook request with the analysis results to thecallbackUrl .


Testing Callbacks

To test the results callback, you can use a service like Webhook.sitehttps://webhook.site

The callback URL must use HTTPS.


Analysis Steps

The analysisSteps array lets you choose which checks to run for a given PreCheck request.

Each step ID below can be included in the analysisSteps array:


Step ID

Description

Required Fields

Optional Fields

Depends on Steps

brand_background_check

Submits the organization name, EIN, and address to a third-party verification service and returns the result. Feedback includes specific reasons for any failure, such as EIN mismatch, invalid EIN, or unresolvable address.

legalName, businessIdentifier, registeredBusinessAddress (must be US)

_`

brand_online_presence_check

Crawls the submitted website to produce a structured summary of the organization's commercial activities — primary products or services, industry, and market scope. Also verifies that the site resolves publicly and plausibly belongs to the submitting organization.

businessWebsiteUrl, legalName

poc_email_domain_check

Verifies that the POC email address uses a domain consistent with the submitting organization's website.

brandPocEmail, legalName, businessWebsiteUrl

_

brand_online_presence_check

privacy_policy_check

Verifies that the privacy policy URL is accessible, belongs to the submitting organization, and contains substantive privacy content. The policy must not be a template, placeholder or another company's policy. Checks for an explicit clause stating that the organization does not share SMS opt-in data or consent with third parties. If the URL is valid but the step cannot retrieve content, the step returns SKIPPED.

privacyPolicyUrl, legalName, businessWebsiteUrl

brand_online_presence_check

terms_of_service_check

Verifies that the TOS URL is accessible and contains substantive terms that belong to the submitting organization

Checks for the required SMS elements: brand or program name, "message and data rates may apply", message frequency disclosure, STOP opt-out instructions, and HELP or support contact information.

Checks that the TOS contains or links to a prohibition on sharing subscriber data with third parties for marketing purposes. Also checks that the TOS links to the privacy policy.

If the URL is valid but the step retrieve content, the step returns SKIPPED.

If ageGated=true, verifies that the TOS documents age-verification requirements and double opt-in.

termsOfServiceUrl, legalName, ageGated, businessWebsiteUrl

brand_online_presence_check

opt_in_method_check

Validates that the opt-in mechanism includes all required opt in disclosures: brand name, message type description, frequency disclosure, MDRA, HELP instructions, and STOP instructions.


For WEB_FORM and QR_CODE: fetches the opt-in page and checks for SMS-specific consent language that is separate from general TOS acceptance.

For SMS_KEYWORD: verifies that optInDescription defines the keyword.

For VERBAL, IVR, PAPER_FORM and POINT_OF_SALE: checks that the URL provided contains content that covers the required disclosures.

optInMethods, optInMethodURLs, optInDescription, optInKeywords

opt_in_message_check

Checks that the opt-in confirmation message contains all five CTIA-required disclosure elements. Verifies that the message clearly identifies the brand using either the legal name or DBA name. Checks that the message tells the subscriber how to get help (HELP keyword or equivalent), how to opt out (STOP keyword or equivalent) and how often to expect messages. Also checks that the message includes the "message and data rates may apply" disclosure.

optInMessage, legalName, dbaName, optInKeywords

opt_out_message_check

Checks that the STOP response message contains the brand name and confirms that the user has been unsubscribed. The message must also state that the user receives no further messages. Validates that optOutKeywords includes at least one keyword.

optOutMessage, optOutKeywords, legalName

help_message_check

Evaluates whether the HELP response contains appropriate brand identification and a meaningful support contact.

Validates that at least helpKeywordsdefines at least one keyword.

helpMessage, helpKeywords, legalName, businessWebsiteUrl

brand_online_presence_check

campaign_description_check

Checks that the campaign description clearly identifies the brand, explains the messaging program purpose, specifies who sends and who receives messages, and and is consistent with the declared use cases.

campaignDescription, useCase, subUseCases, legalName

sample_messages_check

Checks each sample message for the following: brand or display name present; opt-out language in at least one message; public URL shorteners; and embeddedLink consistency with URLS in message bodies.

If ageGated=true, verifies that sample messages include age-gating language.

Evaluates sampleMessages[n].content for placeholders.

sampleMessages, sampleMessage[n].content, sampleMessage[n].useCase, legalName, embeddedLink, embeddedPhone, ageGated

use_case_consistency_check

Cross-checks the declared use case against the campaign description, sample messages, and website content to detect mismatches. Evaluates the messaging purpose implied by each input and compares against the declared use case.

useCase, subUseCases, campaignDescription, sampleMessages, businessWebsiteUrl

shaft_content_check

Screens website content and sample messages for signals across SHAFT categories: Sex, Hate, Alcohol, Firearms, Tobacco/Vape, and Cannabis/CBD. Checks alcohol and tobacco content for age-gated requirements.

businessWebsiteUrl, sampleMessages, ageGated

prohibited_use_case_check

Checks website content and campaign description for prohibited use case signals: payday and short-term lending, cryptocurrency trading, MLM and pyramid schemes, debt relief services, third-party debt collection, high-risk financial content, affiliate marketing or lead generation, and third-party job board references. Also checks for an NMLS license number. Uses brandVerticalType to flag high-risk verticals like GAMBLING or FINANCIAL for additional scrutiny.

businessWebsiteUrl, campaignDescription, directLending, brandVerticalType, affiliateMarketing, sampleMessages


Scoring and Results

The callback provides an overall analysisResult value: PASS, FAIL or ERROR

  • PASS: the PreCheck passed analysis. The callback includes an analysisScore from 0-100 and analysisIssues is null. Currently, any analysisScore above 80 produces a PASS.
  • FAIL: the PreCheck failed analysis. The callback includes an analysisScore from 0-100 is provided, and analysisIssues contains one or more issues.
  • ERROR: an error prevented the analysis from completing, possibly due to an internal issue. The callback includes anerrorCode and errorMessage. Treat this as an analysis error, not a compliance failure. Re-run PreCheck after the error is resolved.

External Project IDs

You can append an externalProjectId to a PreCheck API call. Use this field to reference your own internal project IDs for a brand or launch project. The API also attaches this externalProjectId to the callback when the analysis results are ready.


Authentication

  • Inbound Requests:Authenticate all requests to the PreCheck endpoint (see Request Authentication).

  • Outbound Callbacks: The callback to your system will be signed using the same shared secret (your API key) for HMAC verification. See Webhook Authentication for details.