diff --git a/api-docs.json b/api-docs.json index 86f50bc..67b383c 100644 --- a/api-docs.json +++ b/api-docs.json @@ -1718,7 +1718,7 @@ "type": "string" }, "listIds": { - "description": "To create a blast campaign, set listIds to an array of list IDs to which the campaign should be sent. To create a triggered campaign, omit listIds from the request body.", + "description": "To create a blast campaign, set listIds to a non-empty array of list IDs to which the campaign should be sent. To create a triggered campaign, omit listIds from the request body.", "items": { "format": "int64", "type": "integer" @@ -1729,6 +1729,11 @@ "description": "The name to use in Iterable for the new campaign.", "type": "string" }, + "scheduleSend": { + "description": "Whether to immediately schedule the blast campaign for sending. Defaults to true. Set to false to create the campaign without scheduling it (the campaign can be scheduled later using POST /api/campaigns/{campaignId}/schedule). Only applies to blast campaigns.", + "example": false, + "type": "boolean" + }, "sendAt": { "description": "A scheduled send time for a new blast campaign, up to 21 days in the future. Format: YYYY-MM-DD HH:MM:SS (UTC). For more details, see our API Overview.", "type": "string" @@ -3857,6 +3862,8 @@ "webPushSend", "webPushClick", "webPushSendSkip", + "rcsSend", + "rcsSendSkip", "emailSubscribe", "emailUnSubscribe", "purchase", @@ -7175,6 +7182,8 @@ "webPushSend", "webPushClick", "webPushSendSkip", + "rcsSend", + "rcsSendSkip", "emailSubscribe", "emailUnSubscribe", "purchase", @@ -7329,6 +7338,8 @@ "webPushSend", "webPushClick", "webPushSendSkip", + "rcsSend", + "rcsSendSkip", "emailSubscribe", "emailUnSubscribe", "purchase", diff --git a/src/client/campaigns.ts b/src/client/campaigns.ts index f342fa4..b145a29 100644 --- a/src/client/campaigns.ts +++ b/src/client/campaigns.ts @@ -6,7 +6,7 @@ import { ArchiveCampaignsResponseSchema, CampaignMetricsResponse, CancelCampaignParams, - CreateAndScheduleCampaignParams, + CreateBlastCampaignParams, CreateCampaignResponse, CreateCampaignResponseSchema, CreateTriggeredCampaignParams, @@ -76,8 +76,8 @@ export function Campaigns>(Base: T) { return this.validateResponse(response, GetCampaignResponseSchema); } - async createAndScheduleCampaign( - params: CreateAndScheduleCampaignParams + async createBlastCampaign( + params: CreateBlastCampaignParams ): Promise { const response = await this.client.post("/api/campaigns/create", params); return this.validateResponse(response, CreateCampaignResponseSchema); diff --git a/src/types/campaigns.ts b/src/types/campaigns.ts index 72a346a..3cf9a33 100644 --- a/src/types/campaigns.ts +++ b/src/types/campaigns.ts @@ -153,7 +153,7 @@ const campaignDataFieldsSchema = z ); // Create and schedule a blast campaign -export const CreateAndScheduleCampaignParamsSchema = z.object({ +export const CreateBlastCampaignParamsSchema = z.object({ name: z .string() .describe("The name to use in Iterable for the new campaign"), @@ -164,6 +164,12 @@ export const CreateAndScheduleCampaignParamsSchema = z.object({ .array(z.number()) .min(1) .describe("Array of list IDs to which the campaign should be sent"), + scheduleSend: z + .boolean() + .default(false) + .describe( + "Whether to immediately schedule the blast campaign for sending. Set to true to schedule the campaign on creation. When false, the campaign can be scheduled later using POST /api/campaigns/{campaignId}/schedule." + ), sendAt: IterableDateTimeSchema.describe( "Scheduled send time (YYYY-MM-DD HH:MM:SS UTC)" ), @@ -188,8 +194,8 @@ export const CreateAndScheduleCampaignParamsSchema = z.object({ .describe("Array of suppression list IDs"), }); -export type CreateAndScheduleCampaignParams = z.infer< - typeof CreateAndScheduleCampaignParamsSchema +export type CreateBlastCampaignParams = z.input< + typeof CreateBlastCampaignParamsSchema >; // Create a triggered campaign diff --git a/src/types/export.ts b/src/types/export.ts index 8c3c1c3..6a2003d 100644 --- a/src/types/export.ts +++ b/src/types/export.ts @@ -60,6 +60,8 @@ export const StartExportJobParamsSchema = z.object({ "webPushSend", "webPushClick", "webPushSendSkip", + "rcsSend", + "rcsSendSkip", "emailSubscribe", "emailUnSubscribe", "purchase", diff --git a/tests/integration/campaigns.test.ts b/tests/integration/campaigns.test.ts index d7d213b..2778137 100644 --- a/tests/integration/campaigns.test.ts +++ b/tests/integration/campaigns.test.ts @@ -35,7 +35,7 @@ describe("Campaign Management Integration Tests", () => { sendAt: string; }) => { const createResponse = await retryRateLimited( - () => withTimeout(client.createAndScheduleCampaign(params)), + () => withTimeout(client.createBlastCampaign(params)), `Create blast campaign: ${params.name}` ); return createResponse.campaignId; diff --git a/tests/unit/campaigns.test.ts b/tests/unit/campaigns.test.ts index 59443db..a272111 100644 --- a/tests/unit/campaigns.test.ts +++ b/tests/unit/campaigns.test.ts @@ -14,7 +14,7 @@ import { ArchiveCampaignsParamsSchema, CampaignDetailsSchema, CancelCampaignParamsSchema, - CreateAndScheduleCampaignParamsSchema, + CreateBlastCampaignParamsSchema, CreateTriggeredCampaignParamsSchema, DeactivateTriggeredCampaignParamsSchema, GetCampaignMetricsParamsSchema, @@ -781,10 +781,10 @@ describe("Campaign Management", () => { ).toThrow(); // invalid type }); - it("should validate createAndScheduleCampaign parameters", () => { + it("should validate createBlastCampaign parameters", () => { // Valid parameters - all required fields expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", templateId: 123, listIds: [456], @@ -794,7 +794,7 @@ describe("Campaign Management", () => { // Valid with optional fields expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", templateId: 123, listIds: [456, 789], @@ -809,7 +809,7 @@ describe("Campaign Management", () => { // Missing sendAt expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", templateId: 123, listIds: [456], @@ -818,7 +818,7 @@ describe("Campaign Management", () => { // Missing listIds expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", templateId: 123, sendAt: "2026-03-01 10:00:00", @@ -827,7 +827,7 @@ describe("Campaign Management", () => { // Empty listIds expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", templateId: 123, listIds: [], @@ -837,7 +837,7 @@ describe("Campaign Management", () => { // Missing name expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ templateId: 123, listIds: [456], sendAt: "2026-03-01 10:00:00", @@ -846,7 +846,7 @@ describe("Campaign Management", () => { // Missing templateId expect(() => - CreateAndScheduleCampaignParamsSchema.parse({ + CreateBlastCampaignParamsSchema.parse({ name: "Test Campaign", listIds: [456], sendAt: "2026-03-01 10:00:00", @@ -888,7 +888,7 @@ describe("Campaign Management", () => { }); }); - describe("createAndScheduleCampaign", () => { + describe("createBlastCampaign", () => { it("should call campaigns/create endpoint with blast params", async () => { const mockResponse = { data: { campaignId: 12345 } }; mockAxiosInstance.post.mockResolvedValue(mockResponse); @@ -900,7 +900,7 @@ describe("Campaign Management", () => { sendAt: "2026-03-01 10:00:00", }; - const result = await client.createAndScheduleCampaign(params); + const result = await client.createBlastCampaign(params); expect(mockAxiosInstance.post).toHaveBeenCalledWith( "/api/campaigns/create",