---
title: "Create an SMS/MMS blast or automated schedule; defaults to a draft"
method: POST
path: "/v2/schedules"
tags: ["schedules-v2"]
---

# Create an SMS/MMS blast or automated schedule; defaults to a draft

`POST /v2/schedules`

## Request

- Base URL: `https://api.tracklysms.com/api`
- URL: `https://api.tracklysms.com/api/v2/schedules`
- Auth: API key in header `X-Api-Key`

## Request body

- ScheduleCreateRequest
  - `audiences` string[], required: Audience IDs (required)
  - `automated_percent` number: Automated selection percentage
  - `blasts` ScheduleBlastCreate[]: Blast variants (required for blast type)
    - `creative_name` string: Saved creative name (max 255); defaults to variant_name or schedule name
    - `message` string, required: Inline message text; no saved creative required
    - `mms_image_url` string: MMS image URL
    - `offer_links` BlastOfferLink[]: Offer link mappings
      - `custom_url` string: Absolute HTTPS URL resolving to a public address; use instead of offer_id
      - `key` string: Placeholder key (e.g., link1)
      - `offer_id` string: Offer ID
      - `url_params` object: Additional URL parameters
    - `percent_audience` number, required: Percentage of audience (all must sum to 100)
    - `save_as_creative` boolean: Also save text and links as a reusable manual-send creative
    - `variant_name` string: Variant name for reporting
  - `days_of_week` DaysOfWeek
    - `friday` boolean
    - `monday` boolean
    - `saturday` boolean
    - `sunday` boolean
    - `thursday` boolean
    - `tuesday` boolean
    - `wednesday` boolean
  - `end_date` string, date-time: Repeating end date (required if is_repeating)
  - `filter_bots` boolean: Filter bots
  - `ir_revenue` number: Expected revenue
  - `is_cto` boolean: Click-to-open mode
  - `is_mms` boolean: MMS mode
  - `is_repeating` boolean, required: Whether schedule repeats
  - `name` string, required: Schedule name
  - `send_date` string, date-time: One-time send date (required if !is_repeating)
  - `send_time` string, required: Send time (HH:MM)
  - `send_type` string, required: Type: blast or automated
  - `skip_within_hours` number: Skip if sent within hours
  - `source_lists` integer[]: Optional source list IDs belonging to your account
  - `start_date` string, date-time: Repeating start date (required if is_repeating)
  - `status` string: draft or off saves without sending; on activates the schedule
  - `use_local_time` boolean: Use recipient local time

## Response `201`

Schedule created

- ScheduleCreateResponse
  - `creative_save_errors` ScheduleCreativeSaveError[]: Check even on 201; do not recreate a successful schedule to retry saving an asset
    - `blast_index` integer: Zero-based index in the submitted blasts array
    - `code` string: creative_save_failed
    - `error` string: Asset save failed; the schedule was still created
  - `saved_creatives` ScheduleSavedCreative[]: Included when any variant requests saving
    - `blast_index` integer: Zero-based index in the submitted blasts array
    - `creative_id` integer: Reusable creative ID
    - `name` string: Saved creative name
  - `schedule` ScheduleResponse
    - `audiences` string[]: Audience IDs
    - `automated_percent` number: Automated selection percentage
    - `blasts` ScheduleBlast[]: Blast variants
      - `message` string, required: Inline message text; no saved creative required
      - `mms_image_url` string: MMS image URL
      - `offer_links` BlastOfferLink[]: Offer link mappings
        - `custom_url` string: Absolute HTTPS URL resolving to a public address; use instead of offer_id
        - `key` string: Placeholder key (e.g., link1)
        - `offer_id` string: Offer ID
        - `url_params` object: Additional URL parameters
      - `percent_audience` number, required: Percentage of audience (all must sum to 100)
      - `variant_name` string: Variant name for reporting
    - `created_at` string, date-time: Creation timestamp
    - `days_of_week` DaysOfWeek
      - `friday` boolean
      - `monday` boolean
      - `saturday` boolean
      - `sunday` boolean
      - `thursday` boolean
      - `tuesday` boolean
      - `wednesday` boolean
    - `end_date` string, date-time: Repeating end date
    - `filter_bots` boolean: Filter bots
    - `id` string: Schedule ID
    - `ir_revenue` number: Expected revenue
    - `is_cto` boolean: Click-to-open mode
    - `is_mms` boolean: MMS mode
    - `is_repeating` boolean: Whether schedule repeats
    - `is_transactional` boolean: Read-only. True when this schedule is marked transactional and its messages skip TCPA sending restrictions. Settable only in the Trackly UI, which requires an explicit owner acknowledgement.
    - `name` string: Schedule name
    - `send_date` string, date-time: One-time send date
    - `send_time` string: Send time (HH:MM)
    - `send_type` string: Type: blast or automated
    - `skip_within_hours` number: Skip if sent within hours
    - `source_lists` integer[]: Source list IDs
    - `start_date` string, date-time: Repeating start date
    - `status` string: Status: draft, off, on, complete, archive
    - `updated_at` string, date-time: Last update timestamp
    - `use_local_time` boolean: Use recipient local time
  - `success` boolean: Operation success

## Other responses

- `400`: Validation error
- `401`: Authentication error
- `403`: API key send policy forbids this schedule
- `409`: Schedule write outcome requires reconciliation
- `503`: API key send policy unavailable

---

[API](https://skmtc.dev/tracklysms/apis/trackly-sms-api.md) · [All operations](https://skmtc.dev/tracklysms/apis/trackly-sms-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracklysms/apis/trackly-sms-api/revisions/ac1ad22cb2a9?raw)
