---
title: "Create or Update 10DLC Campaign"
method: POST
path: "/campaigns/dlc"
tags: ["campaigns > dlc"]
---

# Create or Update 10DLC Campaign

`POST /campaigns/dlc`

## Request

- Base URL: `https://api.pinnacle.sh`
- URL: `https://api.pinnacle.sh/campaigns/dlc`
- Auth: API key in header `PINNACLE-API-KEY`

Create a new 10DLC campaign or update an existing one.

<Note>
**To create a new campaign:** Omit `campaignId` — one will be generated automatically.

**Before you start:** Create a [brand](/api-reference/brands/upsert) first — you'll need its `id` for the [`brand`](#request.body.brand) field.

All fields are **required** unless specified otherwise, and will be validated when [submitted](/api-reference/campaigns/10-dlc/submit).

**See the response for example values for each field.**
</Note>

## Request body

- UpsertDLCSchema
  - `autoRenew` boolean: Whether the campaign renews automatically.
  - `brand` string: Brand id. This identifier is a string that always begins with the prefix `b_`, for example: `b_1234567890`.
  - `campaignId` string: Unique identifier for the campaign. This identifier is a string that always begins with the prefix `dlc_`, for example: `dlc_1234567890`.
  - `description` string: Description of the campaign. Explain the purpose, use case, and types of messages your campaign will send. **Example:** `This campaign allows users who have specifically opted in to interact with our chatbot for a range of automated services, including order status notifications, shipping updates, security alerts, and help desk support. Users can manage their account, receive transactional SMS prompts, and access interactive support. They may also share images, such as receipts, and receive immediate responses for support or account updates. All messages are strictly transactional or support-related, never unsolicited, and initiated only after clear user consent.`
  - `keywords` DlcCampaignKeywords: Keyword response configuration.
    - `HELP` DlcCampaignHelpKeywords: Help keyword settings.
      - `message` string: Response message for help keywords. Must include support contact information and standard disclosures. See the [Help keyword requirements](/guides/campaigns/opt-in-compliance#keyword-response-messages).
      - `values` string[]: Keywords that trigger help response (e.g., HELP, SUPPORT, INFO).
    - `OPT_IN` DlcCampaignOptInKeywords: Opt-in keyword settings.
      - `message` string: Response message for opt-in keywords. Must include company name, subscription confirmation, message frequency, HELP/STOP instructions, and links to terms and privacy policy. See the [Opt-In keyword requirements](/guides/campaigns/opt-in-compliance#keyword-response-messages).
      - `values` string[]: Keywords that trigger opt-in (e.g., START, YES, SUBSCRIBE).
    - `OPT_OUT` DlcCampaignOptOutKeywords: Opt-out keyword settings.
      - `message` string: Response message for opt-out keywords. Must confirm unsubscription, provide alternative contact methods, and include opt-in instructions. See the [Opt-Out keyword requirements](/guides/campaigns/opt-in-compliance#keyword-response-messages).
      - `values` string[]: Keywords that trigger opt-out (e.g., STOP, CANCEL, UNSUBSCRIBE).
  - `links` DlcCampaignLinks: Legal documentation links.
    - `privacyPolicy` string, url: Privacy policy URL.
    - `termsOfService` string, url: Terms of service URL.
  - `messageFlow` string: Describe your opt-in workflow. See the [Opt-In Methods and Workflow](/guides/campaigns/opt-in-compliance#opt-in-methods-and-workflow) section for requirements and examples.
  - `name` string: Display name of the campaign.
  - `options` DlcCampaignOptions: Campaign configuration options.
    - `affiliateMarketing` boolean: Whether the campaign uses affiliate marketing.
    - `ageGated` boolean: Whether the campaign is age-gated.
    - `directLending` boolean: Whether the campaign involves direct lending.
    - `embeddedLink` string, url: Link embedded in campaign message.
    - `embeddedPhone` boolean: Whether messages include phone numbers.
    - `numberPooling` boolean: Whether the campaign uses number pooling.
  - `sampleMessages` string[]: Example messages for the campaign. Include 1-5 messages that represent the types of messages you will send. See the [Sample Messages](/guides/campaigns/opt-in-compliance#sample-messages) section for requirements and examples.
  - `useCase` DlcCampaignUseCase: Use case for the campaign.
    - `sub` SUBUSECASES[]: Sub-use case categories.
    - `value` 'ACCOUNT_NOTIFICATION' | 'AGENTS_FRANCHISES' | 'CARRIER_EXEMPT' | 'CHARITY' | 'CUSTOMER_CARE' | 'DELIVERY_NOTIFICATION' | 'EMERGENCY' | 'FRAUD_ALERT' | 'HIGHER_EDUCATION' | 'K12_EDUCATION' | 'LOW_VOLUME' | 'M2M' | 'MARKETING' | 'MIXED' | 'POLITICAL' | 'POLLING_VOTING' | 'PROXY' | 'PUBLIC_SERVICE_ANNOUNCEMENT' | 'SECURITY_ALERT' | 'SOCIAL' | 'SOLE_PROPRIETOR' | 'SWEEPSTAKE' | 'TRIAL' | 'TWO_FA' | 'UCAAS_HIGH' | 'UCAAS_LOW': The primary use case classification for this campaign.

## Response `200`

Successfully created or updated DLC campaign.

- DlcWithExtendedBrandAndStatus: Dlc campaign schema that includes extended brand and status.
  - `autoRenew` boolean, required: Whether the campaign renews automatically.
  - `brand` ExtendedBrand, required
    - `createdAt` string, required: ISO 8601 formatted timestamp of when this brand was added to our system.
    - `id` string, required: The brand's ID. This identifier is a string that always begins with the prefix `b_`, for example: `b_1234567890`.
    - `isArchived` boolean, required: Indicates if this brand is archived.
    - `status` 'PENDING' | 'UNVERIFIED' | 'VERIFIED' | 'VETTED' | 'FAILED' | 'INCOMPLETE', required: Current review status of the brand. `INCOMPLETE`: Has not been submitted. `PENDING`: Currently being reviewed. `VERIFIED`: Verified and good to go. `UNVERIFIED`: No longer verified due to an update in the brand details. `VETTED`: Brand has been vetted by an external provider and has received vetting scores.
    - `updatedAt` string, required: ISO 8601 formatted timestamp of when this brand was last updated.
    - `address` string: Primary brand address where this brand is located.
    - `contact` OptionalContactSchema: Contact information for the primary brand representative.
      - `email` string: Email address of the contact person.
      - `name` string: Full name of the contact person.
      - `phone` string: Phone number of the contact person in E.164 format.
      - `title` string: Job title or position oft he contact person.
    - `dba` string, nullable: "Doing Business As" name - the public name this brand operates under.
    - `description` string: Brief description of what this brand does.
    - `ein` string: Employer Identification Number (EIN) assigned by the IRS.
    - `email` string: Main contact email address for this brand.
    - `name` string: Legal name of the brand as registered.
    - `sector` 'AGRICULTURE' | 'COMMUNICATION' | 'CONSTRUCTION' | 'EDUCATION' | 'ENERGY' | 'ENTERTAINMENT' | 'FINANCIAL' | 'GAMBLING' | 'GOVERNMENT' | 'HEALTHCARE' | 'HOSPITALITY' | 'INSURANCE' | 'MANUFACTURING' | 'NGO' | 'REAL_ESTATE' | 'RETAIL' | 'TECHNOLOGY': Industry the Brand operates in.
    - `type` 'GOVERNMENT' | 'NON_PROFIT' | 'PRIVATE_PROFIT' | 'PUBLIC_PROFIT' | 'SOLE_PROPRIETOR': Legal structure of the brand.
    - `entityType` 'LLC' | 'SOLE_PROPRIETORSHIP' | 'PARTNERSHIP' | 'CORP' | 'S_CORP': Legal entity type of the brand.
    - `website` string: Brand website URL.
  - `campaignId` string, required: Unique identifier for the campaign. This identifier is a string that always begins with the prefix `dlc_`, for example: `dlc_1234567890`.
  - `description` string: Description of the campaign.
  - `keywords` DlcWithExtendedBrandAndStatusKeywords, required: Keyword response configuration.
    - `HELP` DlcWithExtendedBrandAndStatusKeywordsHelp, required: Help keyword settings.
      - `message` string: Response message for help keywords. See the [Keyword Response Messages](/guides/campaigns/opt-in-compliance#keyword-response-messages) section for requirements.
      - `values` string[], required: Keywords that trigger help response.
    - `OPT_IN` DlcWithExtendedBrandAndStatusKeywordsOptIn, required: Opt-in keyword settings.
      - `message` string: Response message for opt-in keywords. See the [Keyword Response Messages](/guides/campaigns/opt-in-compliance#keyword-response-messages) section for requirements.
      - `values` string[], required: Keywords that trigger opt-in.
    - `OPT_OUT` DlcWithExtendedBrandAndStatusKeywordsOptOut, required: Opt-out keyword settings.
      - `message` string: Response message for opt-out keywords. See the [Keyword Response Messages](/guides/campaigns/opt-in-compliance#keyword-response-messages) section for requirements.
      - `values` string[], required: Keywords that trigger opt-out.
  - `links` DlcWithExtendedBrandAndStatusLinks: Legal documentation links.
    - `privacyPolicy` string, url: Privacy policy URL.
    - `termsOfService` string, url: Terms of service URL.
  - `messageFlow` string: Describe the flow of how users will opt in to this campaign. See the [Opt-In Methods and Workflow](/guides/campaigns/opt-in-compliance#opt-in-methods-and-workflow) section for requirements.
  - `name` string: Display name of the campaign.
  - `options` DlcWithExtendedBrandAndStatusOptions, required: Campaign configuration options.
    - `affiliateMarketing` boolean, required: Whether the campaign uses affiliate marketing.
    - `ageGated` boolean, required: Whether the campaign is age-gated.
    - `directLending` boolean, required: Whether the campaign involves direct lending.
    - `embeddedLink` string, url: Link embedded in campaign message.
    - `embeddedPhone` boolean, required: Whether messages include phone numbers.
    - `numberPooling` boolean, required: Whether the campaign uses number pooling.
  - `sampleMessages` string[]: Example messages for the campaign. See the [Sample Messages](/guides/campaigns/opt-in-compliance#sample-messages) section for requirements.
  - `status` 'INCOMPLETE' | 'IN REVIEW' | 'VERIFIED' | 'FAILED', required: Current review status of the campaign. <br> `INCOMPLETE`: Not submitted. <br> `IN REVIEW`: Being reviewed by carriers. <br> `VERIFIED`: Approved and ready to send messages.<br> `FAILED`: Issues and errors related to the campaign's details.
  - `useCase` DlcWithExtendedBrandAndStatusUseCase: Use case for the campaign.
    - `sub` SUBUSECASES[]: Sub-use case categories.
    - `value` 'ACCOUNT_NOTIFICATION' | 'AGENTS_FRANCHISES' | 'CARRIER_EXEMPT' | 'CHARITY' | 'CUSTOMER_CARE' | 'DELIVERY_NOTIFICATION' | 'EMERGENCY' | 'FRAUD_ALERT' | 'HIGHER_EDUCATION' | 'K12_EDUCATION' | 'LOW_VOLUME' | 'M2M' | 'MARKETING' | 'MIXED' | 'POLITICAL' | 'POLLING_VOTING' | 'PROXY' | 'PUBLIC_SERVICE_ANNOUNCEMENT' | 'SECURITY_ALERT' | 'SOCIAL' | 'SOLE_PROPRIETOR' | 'SWEEPSTAKE' | 'TRIAL' | 'TWO_FA' | 'UCAAS_HIGH' | 'UCAAS_LOW': The primary use case classification for this campaign.
  - `mnoBrandTier` 'TOP' | 'HIGH_MID' | 'LOW_MID' | 'LOW': The MNO brand tier for T-Mobile rate limits. Tiers range from `TOP` (highest) to `LOW` (lowest), based on your brand's vetting score. See [SMS Rate Limits](/guides/messages/rate-limits) for details.
  - `mnoTcrTier` 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'N' | 'T' | 'S': The MNO TCR message class for AT&T, Verizon, and other carriers. Classes `A`-`G` are standard (based on vetting score), while `T`, `N`, and `S` are for special use cases. See [SMS Rate Limits](/guides/messages/rate-limits) for details.

## Other responses

- `400`: The request was unacceptable, often due to providing an invalid update. <br> Errors may originate from invalid payload or from Pinnacle's additional validation checks. For example, providing an URL that cannot be accessed, updating a campaign that is currently being reviewed, updating data that you cannot access, sending a malformed message, and so on. <br> For `Pinnacle Validation Error` inspect the `error` payload to determine the source of the failure. These errors are likely due to additional validation and business logic checks.<br> For `Request Validation Error` inspect the `description` and `errors` payload to determine the source of failure. These errors are likely due to invalid payload inside the request.
- `401`: The request lacks valid authentication credentials or the provided credentials are invalid. <br> Ensure you're including a valid API key in the request headers and that your account has the necessary permissions to access this endpoint.
- `403`: Your subscription does not include access to this feature. <br> This occurs when attempting to use functionality that requires a higher subscription tier. Please upgrade your subscription to access this feature.
- `404`: The requested resource could not be found. <br> This may occur if the identifier is incorrect, the resource has been deleted, or you don't have permission to access it.
- `500`: An unexpected error occurred on Pinnacle's servers while processing your request. <br> If this error persists, please contact support with the request details.

---

[API](https://skmtc.dev/pinnacle/apis/pinnacle-2.md) - [All operations](https://skmtc.dev/pinnacle/apis/pinnacle-2/llms.txt) - [OpenAPI document](https://skmtc.dev/pinnacle/apis/pinnacle-2/revisions/45416dadab79?raw)
