Correct a campaign without creating another registration
Use this route to revise an existing campaign’s description, message examples, consent explanation or supported content characteristics. Keep the campaign ID and its current brand/use case. A new registration is not the retry mechanism for an existing campaign correction.
Authenticate with an enabled API account over HTTPS from a permitted source IP address. Only a campaign belonging to that account is available. Read its current state before preparing changes; expired campaigns cannot be updated through this workflow.
curl --silent --show-error --fail-with-body --user "$API_USER:$API_PASSWORD" \
"https://api.multitel.net/tcr/v2/campaign/$CAMPAIGN_ID"Choose the fields that actually changed
Prepare campaign-update.json containing the supported changes. The current portal sends only changed campaign fields and does not send brandId, usecase, campaignId or response-only status information. Direct API updates also use a JSON object of fields, not the portal’s changes/version wrapper.
| Fields | What to provide |
|---|---|
| description, messageFlow | An accurate service description and how people consent, receive messages and withdraw consent. Each allows 40–4096 characters. |
| sample1–sample5 | Realistic samples for this campaign, 20–1024 characters per nonempty sample. Preserve the sample count required by the qualified use case; do not send unrelated messages. |
| helpMessage, optinMessage, optoutMessage | Applicable recipient-facing responses, up to 1024 characters. When required, meet the 20-character minimum and explain the real service. Review the current consent requirements before clearing a field. |
| optinKeywords, optoutKeywords, helpKeywords | Comma-separated keywords without spaces, up to 255 characters. Keep responses and operational keyword handling consistent. |
| privacyPolicyLink, termsAndConditionsLink | Relevant public URLs, up to 2048 characters, describing this service’s real practices. |
| embeddedLinkSample | A representative link that messages will contain, up to 255 characters. |
| numberPool, embeddedLink, embeddedPhone, ageGated, directLending | Actual campaign characteristics as JSON booleans. Use false, not the string "false", when disabling one. |
| autoRenewal | The public API schema supports this JSON boolean, although the portal’s ordinary campaign-content editor does not expose it. Disabling renewal does not cancel an existing minimum commitment or erase charges already due. |
| resellerId | The schema also offers reseller association. This is outside the ordinary portal content-correction form. Do not use this field to move a campaign between customers or assume the API will configure carrier service for a different reseller. |
The update schema does not offer brandId, usecase, subscriberOptin, subscriberOptout or subscriberHelp as mutable fields. Do not copy a complete campaign-creation payload into an update. Consult current qualification when reviewing message requirements.
Submit a focused correction
This example describes an illustrative appointment-reminder service. Adapt it to the campaign’s actual service and consent flow before using it.
{
"description": "Appointment reminders requested by customers of the registered business.",
"sample1": "Example business: Your requested appointment reminder is ready. Reply STOP to opt out."
}curl --silent --show-error --fail-with-body --user "$API_USER:$API_PASSWORD" \
--request PUT \
--header 'Content-Type: application/json' \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--data-binary @campaign-update.json \
"https://api.multitel.net/tcr/v2/campaign/$CAMPAIGN_ID"Keep the same key and exact method, path, query and body bytes for the same intended submission. Changed content requires a separately reviewed request; do not rotate keys blindly after a timeout. A completed request can replay a cached error, and a processing duplicate can return 409 with Retry-After.
Read the campaign again
HTTP 200 returns a direct campaign JSON object. Verify campaignId, then GET the same campaign and compare the intended fields. A successful save does not itself request another carrier review, change number assignments, activate sending or send a message.
The portal checks a form version before saving and reads the campaign again afterward. The public PUT endpoint does not enforce that portal version: coordinate simultaneous edits. An idempotency key does not detect another editor’s update.
If the portal shows an outstanding review decline, correct the content first, then use its separate request-review action when available. That action checks the current production campaign and sharing state. Saving content alone does not invoke it, and the existence of a campaign ID does not establish approval.
Ordinary campaign PUT updates do not dispatch a separate campaign-registration debit in the current service. Existing monthly fees, minimum commitments, number rental and message usage still apply. For the current configured campaign rates, see campaign fees.
Handle restrictions and uncertain results
For HTTP 400, read the field-level error and check lengths, consent text and the campaign’s state. For 401, 403 or 404, check API credentials, permitted source IP and ownership. For 429, honor Retry-After. For a 500, 502 or interrupted request, preserve the campaign ID and any requestId, then reconcile the existing record before another submission.
The local snapshot depends on the returned body. A nonempty partial response can omit older fields, including renewal metadata; an empty response can keep stale values. Verify the full GET result instead of treating success alone as evidence that every field was preserved. Report unresolved differences through support. This route does not atomically update carrier assignments or provide a general carrier-activation recovery action.