Schedule a promotion (public API-key endpoint)
const url = 'https://api.tryletterhead.com/api/v3/promotions/actions/schedule';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"campaignTitle":"Summer Sale 2026","channels":["an-example-channel"],"headline":"50% off summer collection","contentText":"Limited-time offer on all summer items.","imageUrl":"https://cdn.example.com/summer-sale.png","imageAlternativeText":"Summer sale banner","promotionLink":"https://example.com/summer-sale","promoter":"Example Brand","dates":["2026-07-01"],"isActive":true,"isEvergreen":false,"zone":"A","type":2}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.tryletterhead.com/api/v3/promotions/actions/schedule \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "campaignTitle": "Summer Sale 2026", "channels": [ "an-example-channel" ], "headline": "50% off summer collection", "contentText": "Limited-time offer on all summer items.", "imageUrl": "https://cdn.example.com/summer-sale.png", "imageAlternativeText": "Summer sale banner", "promotionLink": "https://example.com/summer-sale", "promoter": "Example Brand", "dates": [ "2026-07-01" ], "isActive": true, "isEvergreen": false, "zone": "A", "type": 2 }'Create a new promotional campaign, identical in body and response shape to Create a
promotion. This endpoint is built specifically for external tools scheduling promotions via
the public API: it authenticates with a company API key only (never a Passport/JWT session),
and — unlike other v3 promotion endpoints — does not require the api=true query
parameter, since API-key auth is the only auth this endpoint accepts.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”object
Internal name of the campaign
Slugs of channels to scope to. null/omitted means all channels. Required when allChannels: false is sent explicitly.
Display headline of the ad
Body copy
Publicly accessible image URL
Alt text for accessibility
Click-through destination. Must be http(s).
Display name of the advertiser
Y-m-d dates when the promotion runs. Ignored at send time if isEvergreen: true.
true = scheduled/live, false = draft
true = always runs, dates are ignored at send time
Template position. One of A, B, C, D, E, F, G, H, I, J. Required unless autoInject: true is sent — there is no default, and omitting it without autoInject returns a 422 validation error.
Template type: 1=Text only, 2=Text & Image, 4=Banner, 7=HTML
When true, the promotion is auto-placed into every send at autoInjectPosition instead of a manually-chosen zone. When true, zone may be omitted but autoInjectPosition becomes required. Defaults to false (manual placement via zone).
0-100 placement position, required when autoInject: true. Ignored for manual (non-auto-inject) promotions.
Example
{ "campaignTitle": "Summer Sale 2026", "channels": [ "an-example-channel" ], "headline": "50% off summer collection", "contentText": "Limited-time offer on all summer items.", "imageUrl": "https://cdn.example.com/summer-sale.png", "imageAlternativeText": "Summer sale banner", "promotionLink": "https://example.com/summer-sale", "promoter": "Example Brand", "dates": [ "2026-07-01" ], "isActive": true, "isEvergreen": false, "zone": "A", "type": 2}Responses
Section titled “ Responses ”201 Created
object
object
Example
{ "items": { "promotionCollateralUid": "b2c3d4e5f6", "campaignTitle": "Summer Sale 2026", "channels": [ "an-example-channel" ], "allChannels": false, "headline": "50% off summer collection", "contentText": "Limited-time offer on all summer items.", "imageUrl": "https://cdn.example.com/summer-sale.png", "imageAlternativeText": "Summer sale banner", "imageWidth": 0, "imageHeight": 0, "promotionLink": "https://example.com/summer-sale", "promoter": "Example Brand", "promotionServiceProviderId": 0, "dates": [ "2026-07-01" ], "isActive": true, "isInactive": false, "isEvergreen": false, "embedClicks": 0, "zone": "A", "type": 2, "createdAt": "2026-06-04 17:30:00", "updatedAt": "2026-06-04 17:30:00" }, "message": "Promotion created successfully", "total": 1}Still can’t find what you need? Contact support.