Fixing a Rejected or Changes-Needed Campaign
Campaign reviews are done by human reviewers, not automated systems. When they need something from you, the campaign status changes to changes_needed or rejected. Here's how to read the feedback and get your campaign approved.
Campaign status lifecycle
created → pending → in_review → active
↘ changes_needed → (resubmit) → in_review
↘ rejected
↘ deactivated
↘ canceledcreated— you submitted the campaign, Surge has received itpending— queued for submission to the carrier network (internal state; the API returnsin_reviewwhile here)in_review— actively being reviewed by TCR and carrier reviewersactive— approved; you can attach phone numbers and send production trafficchanges_needed— reviewer flagged issues; you need to update and resubmit (internal state; the API returnsrejectedwhile here)rejected— campaign was rejected; see notes on appealing belowdeactivated— previously active campaign suspended by carriercanceled— you or Surge canceled the campaign
API status values. The campaign
statusfield in API responses uses a condensed set of public values:created,in_review,active,rejected,canceled,deactivated. Both thependingandin_reviewinternal states surface as"in_review"in the API. Both thechanges_neededandrejectedinternal states surface as"rejected". Keep this in mind when polling for status or using the update table below.
Understanding "changes needed" feedback
When a campaign moves to changes_needed, Surge sends you an email with reviewer notes. Read it carefully — reviewers include specific details about what needs to change.
Common patterns and what they mean:
| Reviewer says | What to fix |
|---|---|
| "The website doesn't give much info" | Add clear business description and contact information to your homepage |
| "The opt-in page doesn't show required disclosures" | Add message frequency notice, "Msg&data rates apply", and "Reply STOP to opt out" next to the opt-in checkbox |
| "The sample message contains placeholder text" | Replace {brand name}, {Agent Name}, etc. with actual values |
| "The privacy policy is behind a login" | Move the privacy policy to a publicly accessible URL |
| "Your business email doesn't match the domain" | Use an email at your business domain, not a personal or generic address |
Updating a campaign
To address feedback, update the relevant campaign fields and resubmit. Campaigns can only be updated in certain statuses:
| Status (API value) | Can update? |
|---|---|
created | Yes |
in_review | Usually no — returns campaign_locked (409) once a reviewer picks it up. A brief window exists while the campaign is still queued (internally pending) before review begins. |
rejected | Yes — both "changes needed" and hard-rejected campaigns can be updated. |
canceled | Yes |
active | No — returns campaign_locked (409) |
deactivated | No — returns campaign_locked (409) |
If you try to update while in_review, wait for the review to complete. The reviewer will either approve it, request changes (moving it to changes_needed), or reject it. Only then can you update.
curl -X PATCH https://api.surge.app/campaigns/CAMPAIGN_ID \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"consent_flow": "Users enter their phone number during checkout. An unchecked checkbox labeled \"I agree to receive text messages from Acme Corp\" is present. Required disclosures are shown: \"Message frequency varies. Msg&data rates apply. Reply STOP to opt out. View our Privacy Policy at acme.com/privacy.\"",
"message_samples": [
"Acme Corp: Your order #12345 has shipped! Track it: https://acme.com/track",
"Acme Corp: Your cart is waiting. Complete your order: https://acme.com/cart. Reply STOP to opt out."
]
}'After updating a changes_needed or rejected campaign, the campaign moves back to pending and then in_review.
Checking campaign status
Poll the campaign endpoint to track the current status:
curl https://api.surge.app/campaigns/CAMPAIGN_ID \
-H "Authorization: Bearer YOUR_API_KEY"{
"id": "cpn_01jrzhe8d9enptypyx360pcmxl",
"status": "in_review",
"use_cases": ["marketing"],
"volume": "low"
}Or subscribe to the campaign.approved webhook event to get notified the moment a campaign goes active — this avoids polling. See Webhook Events.
Rejected campaigns
A rejected status is more serious than changes_needed. Unlike changes_needed, a rejection doesn't automatically move the campaign back into the queue when you update it — you may need to create a new campaign entirely.
If your campaign is rejected:
- Read the rejection notice carefully — reviewers include the specific reason
- Address every listed issue before doing anything else (partial fixes typically lead to another rejection)
- Contact Surge support to confirm whether to resubmit the existing campaign or start a new one
Rejections related to spam or misuse may affect your account's ability to register future campaigns. Make sure your opt-in flow, sample messages, and business identity are solid before resubmitting. If you're unsure what went wrong, Avoiding Rejection covers the seven most common patterns.