Duplicate a messaging program
POST/api/v1/sms/messaging-programs/{id}/duplicate
POST /sms/messaging-programs/{id}/duplicate
curl -X POST 'https://www.unitpost.com/api/v1/sms/messaging-programs/123/duplicate' \
-H 'Authorization: Bearer YOUR_API_KEY' \
-H 'User-Agent: my-app/1.0'Response · 201
{
"name": "Example",
"description": "string",
"message_type": "transactional",
"canonical_purpose": "string",
"frequency_disclosure": "string",
"opt_in_type": "string",
"opt_in_workflow": "string",
"opt_in_confirmation": "string",
"help_message": "string",
"stop_message": "string",
"terms_url": "https://example.com",
"privacy_url": "https://example.com",
"monthly_volume": "string",
"sample_messages": [
"string"
],
"embedded_links": false,
"embedded_link_sample": "string",
"embedded_phones": false,
"age_gated": false,
"provider_overrides": {
"toll_free": {
"use_case_category": "string"
},
"ten_dlc": {
"use_case": "string",
"sub_use_cases": [
"string"
]
}
},
"recipe_id": "recipe_123",
"consent_setup_id": "consent_setup_123",
"object": "sms_messaging_program",
"id": "id_123",
"recipe_version": 0,
"revision": 0,
"readiness": {
"ready": false,
"missing": [
"string"
]
},
"archived_at": "2026-01-01T00:00:00.000Z",
"created_at": "2026-01-01T00:00:00.000Z",
"updated_at": "2026-01-01T00:00:00.000Z"
}Copy a program (an archived one too) into a new editable one named "… (copy)" at revision 1, its consent setup and recipe included. Takes no body. Pass an Idempotency-Key so a retry returns the same copy. Requires the sms:manage capability.
Parameters2 fields
| Field | Type | Description |
|---|---|---|
idrequired | string · path | — |
Idempotency-Key | string · header | Any unique string (1–256 characters, e.g. a UUID). Retrying with the same key and the same body within 24 hours returns the first result instead of sending again; the same key with a different body is `409 invalid_idempotent_request`, and one still in flight is `409 concurrent_idempotent_requests`. |
Response · 201 fields29 fields
| Field | Type | Description |
|---|---|---|
namerequired | string | — |
description | string | null | — |
message_typerequired | enumtransactional | marketing | — |
canonical_purpose | string | null | — |
frequency_disclosure | string | null | — |
opt_in_type | string | null | — |
opt_in_workflow | string | null | — |
opt_in_confirmation | string | null | — |
help_message | string | null | — |
stop_message | string | null | — |
terms_url | string | null | — |
privacy_url | string | null | — |
monthly_volume | string | null | — |
sample_messagesrequired | string[] | — |
embedded_linksrequired | boolean | — |
embedded_link_sample | string | null | — |
embedded_phonesrequired | boolean | — |
age_gatedrequired | boolean | — |
provider_overrides | object | null | — |
recipe_idrequired | string | null | — |
consent_setup_id | string | null | A consent setup (`cset_…`) this workspace has. |
objectrequired | string | — |
idrequired | string | — |
recipe_versionrequired | integer | null | — |
revisionrequired | integer | Moves on a material change; registrations keep the revision they copied. |
readinessrequired | object | Whether the program has what a registration needs; `missing` names the fields still to fill (the wizard's own check). |
archived_atrequired | string | null | — |
created_atrequired | string | — |
updated_atrequired | string | — |
201400401403404409422