---
title: "Update a campaign"
method: PUT
path: "/v3/profiles/{profileId}/campaigns/{campaignId}"
tags: ["Profiles"]
deprecated: true
---

# Update a campaign

`PUT /v3/profiles/{profileId}/campaigns/{campaignId}`

## Request

- Base URL: `https://api.sent.dm`
- URL: `https://api.sent.dm/v3/profiles/{profileId}/campaigns/{campaignId}`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

> **Deprecated.**

**Deprecated.** This endpoint is replaced by `/v3/sender-profiles` and will be removed in a future release. It still behaves exactly as before, so nothing needs to change today — but new integrations should use `/v3/sender-profiles`, which models a profile's markets, compliance, brand, campaigns and billing explicitly.

Updates an existing campaign under the brand of the specified profile. Once the campaign has been submitted to TCR its volume can no longer move between low volume (under 2,000 messages a day) and high volume.

## Path parameters

- `profileId` string, uuid, required
- `campaignId` string, uuid, required

## Headers

- `Idempotency-Key` string
- `x-profile-id` string, uuid

## Request body

- SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsRequestsUpdateBrandCampaignRequest: Request to update an existing campaign
  - `sandbox` boolean: Sandbox flag - when true, the operation is simulated without side effects Useful for testing integrations without actual execution
  - `campaign` SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsRequestsCampaignData, required: Campaign data for create or update operation
    - `name` string, required: Campaign name
    - `description` string, required: Campaign description
    - `type` string, required: Campaign type (e.g., "KYC", "App"). Still required of a caller, and consulted by nothing. It named the signup path that produced the campaign, was written to a column no query filters on, no TCR payload carries and no fee or status decision reads, and is now defaulted at the entity instead. It stays required so that a request which was valid before is still valid — dropping it would be the client-visible change, not keeping it.
    - `useCases` SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsRequestsCampaignUseCaseData[], required: List of use cases with sample messages
      - `messagingUseCaseUs` 'MARKETING' | 'ACCOUNT_NOTIFICATION' | 'CUSTOMER_CARE' | 'FRAUD_ALERT' | 'TWO_FA' | 'DELIVERY_NOTIFICATION' | 'SECURITY_ALERT' | 'M2M' | 'MIXED' | 'HIGHER_EDUCATION' | 'POLLING_VOTING' | 'PUBLIC_SERVICE_ANNOUNCEMENT' | 'LOW_VOLUME', required
      - `sampleMessages` string[], required: Sample messages for this use case (1-5 messages, max 1024 characters each)
    - `volume` string, nullable: Expected messaging volume for this campaign. Numeric string (e.g. "1999", "5000"). Values below 2000 bill at the low-volume tier.
    - `messageFlow` string, nullable: Description of how messages flow in the campaign
    - `privacyPolicyLink` string, uri, nullable: URL to privacy policy
    - `termsAndConditionsLink` string, uri, nullable: URL to terms and conditions
    - `optinMessage` string, nullable: Message sent when user opts in
    - `optoutMessage` string, nullable: Message sent when user opts out
    - `helpMessage` string, nullable: Message sent when user requests help
    - `optinKeywords` string, nullable: Comma-separated keywords that trigger opt-in (e.g., "YES, START, SUBSCRIBE")
    - `optoutKeywords` string, nullable: Comma-separated keywords that trigger opt-out (e.g., "STOP, UNSUBSCRIBE, END")
    - `helpKeywords` string, nullable: Comma-separated keywords that trigger help message (e.g., "HELP, INFO, SUPPORT")

## Response `200`

Campaign updated successfully

- SentDmServicesEndpointsCustomerAPIv3SharedApiResponseOfBrandCampaignV3Response: Standard API response envelope for all v3 endpoints
  - `success` boolean: Indicates whether the request was successful
  - `data` SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsResponsesBrandCampaignV3Response: A 10DLC campaign registered for a brand.
    - `id` string, uuid
    - `customerId` string, uuid
    - `type` string: Campaign type (for example KYC or App).
    - `name` string
    - `description` string
    - `brandId` string, uuid, nullable
    - `status` 'SENT_CREATED' | 'ACTIVE' | 'EXPIRED'
    - `tcrCampaignId` string, nullable: The Campaign Registry identifier, once the campaign has been accepted.
    - `submittedToTCR` boolean
    - `submittedAt` string, date-time, nullable
    - `cost` number, nullable
    - `billedDate` string, date-time, nullable
    - `messageFlow` string, nullable
    - `volume` string, nullable: Expected messaging volume for this campaign — customer-supplied on create/update, and the input to both the TCR usecase classification (LOW_VOLUME vs MIXED/specific) and the campaign fee tier. Surfaced so customers can read back the value they set.
    - `privacyPolicyLink` string, nullable
    - `termsAndConditionsLink` string, nullable
    - `optinMessage` string, nullable
    - `optoutMessage` string, nullable
    - `helpMessage` string, nullable
    - `optinKeywords` string, nullable
    - `optoutKeywords` string, nullable
    - `helpKeywords` string, nullable
    - `dcaElectionsComplete` boolean, nullable: True once every carrier has completed its DCA election and the campaign is operationally ready for traffic.
    - `dcaElectionsCompletedAt` string, date-time, nullable
    - `tcrSyncError` string, nullable: Surfaced so customers can see why a submission did not reach the registry.
    - `hasSubmissionTransaction` boolean: True when the one-time campaign submission fee has already been charged.
    - `useCases` SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsResponsesCampaignUseCaseV3Response[]
      - `id` string, uuid
      - `campaignId` string, uuid
      - `customerId` string, uuid
      - `messagingUseCaseUs` 'MARKETING' | 'ACCOUNT_NOTIFICATION' | 'CUSTOMER_CARE' | 'FRAUD_ALERT' | 'TWO_FA' | 'DELIVERY_NOTIFICATION' | 'SECURITY_ALERT' | 'M2M' | 'MIXED' | 'HIGHER_EDUCATION' | 'POLLING_VOTING' | 'PUBLIC_SERVICE_ANNOUNCEMENT' | 'LOW_VOLUME'
      - `sampleMessages` string[]: Sample messages submitted to the registry for this use case.
      - `createdAt` string, date-time
      - `updatedAt` string, date-time, nullable
    - `createdAt` string, date-time
    - `updatedAt` string, date-time, nullable
  - `error` SentDmServicesEndpointsCustomerAPIv3SharedApiError: Error information
    - `code` string: Machine-readable error code (e.g., "RESOURCE_001")
    - `message` string: Human-readable error message
    - `details` object, nullable: Additional validation error details (field-level errors)
    - `doc_url` string, nullable: URL to documentation about this error
  - `meta` SentDmServicesEndpointsCustomerAPIv3SharedApiMeta: Request and response metadata
    - `request_id` string: Unique identifier for this request (for tracing and support)
    - `timestamp` string, date-time: Server timestamp when the response was generated
    - `version` string: API version used for this request

## Other responses

- `400`: Invalid request - validation errors or inherit_tcr_campaign=true
- `401`: Unauthorized - Valid API key required
- `403`: Forbidden
- `404`: Profile, brand, or campaign not found
- `409`: The campaign is registered with TCR and the volume would change its tier
- `500`: Internal server error occurred

## Changes

- **2026-10-28** `41acb2ceb84d`: 1 info
  - added the non-success response with the status `409`
- **2026-10-16** `6c829543a93e`: 5 breaking, 1 warning, 16 info
  - added `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3SharedMutationRequestBase, subschema #2: SentDmServicesEndpointsCustomerAPIv3BrandsCampaignsRequestsUpdateBrandCampaignRequest_Properties` to the request body `allOf` list
  - added `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3SharedApiMeta` to the `meta` response property `oneOf` list for the response status `200`
  - added `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3SharedApiMeta` to the `meta` response property `oneOf` list for the response status `400`
  - added `#/components/schemas/SentDmServicesEndpointsCustomerAPIv3SharedApiMeta` to the `meta` response property `oneOf` list for the response status `404`
  - …18 more
- …earlier changes not shown

[Operation history](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/changes/v3/profiles/:profileId/campaigns/:campaignId/put.md)

---

[API](https://skmtc.dev/sentdm/apis/sent-dm-api-v3.md) - [All operations](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/llms.txt) - [OpenAPI document](https://skmtc.dev/sentdm/apis/sent-dm-api-v3/revisions/bdcca958cac7?raw)
