Duplicate campaign
Overview
Duplicate a campaign (and its active channels) under the same company as a fresh draft named "… (Copy)" with audience/scheduling fields reset.
Prerequisites
- A bearer token with ACCOUNT scope.
- The
campaignIdof the record you are targeting.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/campaign/{campaignId}/duplicate
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: ACCOUNT-scope tokens.
-
If not owned by the caller it returns 403 ("You are not authorized to duplicate this campaign").
Rate limit
- No rate limit.
Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
campaignId | integer | Required | Digits only. |
Response
data.status(string) —"success".data.message(string).data.data(object) — the new campaign viagetCampaignData(newCampaignId); same shape as the campaign detail response. The copy is forced tostatus="draft",current_step=1,total_audience=0,request_file_status="pending", withscheduled_at/started_at/completed_at/next_execution_timenulled andrequest_per_day/request_frequency/request_delayzeroed; The endpoint copies channels against the new campaign id.
200 OK · 200
200{
"data": {
"status": "success",
"message": "Campaign duplicated successfully",
"data": {
"id": 42,
"name": "Summer Review Campaign (Copy)",
"description": "Collect summer reviews",
"status": "draft",
"current_step": 1,
"store_id": 123,
"scheduled_at": null,
"started_at": null,
"completed_at": null,
"total_audience": 0,
"request_per_day": 0,
"request_frequency": 0,
"request_delay": 0,
"request_after_time": "14:00:00",
"next_execution_time": null,
"request_file_status": "pending",
"request_file_name": null,
"request_file_path": null,
"send_immediately": false,
"type": "bulk_upload",
"channels": [],
"email_requests": [],
"sms_requests": [],
"file_header": null
}
}
}Errors
| Status | Meaning |
|---|---|
401 | The bearer token is missing, expired or invalid |
403 | The token is valid but the record sits outside your account |
422 | The request failed validation — the response names the fields |
500 | Unexpected server error |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/campaign/123/duplicate" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json'Updated 11 days ago
Did this page help you?
