> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tracklysms.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a Creative

> Retrieve a single creative by its ID.

Returns the full details of a single creative, including its message template, offer links, and calculated segment count.

## Path Parameters

<ParamField path="id" type="integer" required>
  The unique identifier of the creative.
</ParamField>

## Response Fields

<ResponseField name="id" type="integer">
  Unique identifier for the creative.
</ResponseField>

<ResponseField name="name" type="string">
  Display name of the creative.
</ResponseField>

<ResponseField name="message" type="string">
  The message template with `{{linkN}}` placeholders.
</ResponseField>

<ResponseField name="offer_links" type="array">
  Array of offer link objects that map to placeholders in the message.

  <Expandable title="Offer link properties">
    <ResponseField name="key" type="string">
      The placeholder key (e.g. `link1`).
    </ResponseField>

    <ResponseField name="offer_id" type="string">
      The ID of the offer associated with this link. A 24-character hexadecimal ObjectId.
    </ResponseField>

    <ResponseField name="url" type="string">
      Optional URL override, or `null` if using the offer's default URL.
    </ResponseField>

    <ResponseField name="url_params" type="object">
      Additional query parameters appended to the link URL.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="offers" type="array">
  Array of offer ID strings referenced by this creative.
</ResponseField>

<ResponseField name="status" type="string">
  Current status. One of: `active`, `paused`, `archived`.
</ResponseField>

<ResponseField name="creative_type" type="string">
  The type of creative. One of: `automated`, `one_time`, `welcome`.
</ResponseField>

<ResponseField name="character_count" type="integer">
  Estimated character count of the rendered message. Link placeholders are estimated as 23 characters each, plus 34 characters of compliance overhead.
</ResponseField>

<ResponseField name="segment_count" type="integer">
  Estimated number of SMS segments, encoding-aware. The message is expanded (link placeholders as 23 characters plus 34 characters of compliance overhead) and segmented the way carriers bill it. GSM-7 messages fit 160 septets in a single segment, or 153 septets per part when concatenated; extension-table characters (`^ { } [ ] ~ | € \` and form-feed) cost 2 septets each. If the message contains any non-GSM-7 character (e.g. emoji), UCS-2 encoding applies instead: 70 characters single, 67 per concatenated part.
</ResponseField>

<ResponseField name="created_at" type="datetime">
  ISO 8601 timestamp of when the creative was created.
</ResponseField>

<ResponseField name="slug" type="string">
  Auto-generated unique slug for the creative.
</ResponseField>

<ResponseField name="list_control_mode" type="string">
  List targeting control mode. One of: `all` (default), `include`, `exclude`.
</ResponseField>

<ResponseField name="list_control_ids" type="array">
  List IDs used when `list_control_mode` is `include` or `exclude`.
</ResponseField>

## Examples

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.tracklysms.com/api/v2/creatives/101" \
    -H "X-Api-Key: trk_your_api_key_here"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.tracklysms.com/api/v2/creatives/101",
      headers={"X-Api-Key": "trk_your_api_key_here"}
  )

  creative = response.json()
  print(f"{creative['name']} — {creative['segment_count']} segment(s)")
  print(f"Message: {creative['message']}")
  ```

  ```javascript Node.js theme={null}
  const response = await fetch(
    "https://api.tracklysms.com/api/v2/creatives/101",
    {
      headers: {
        "X-Api-Key": "trk_your_api_key_here",
      },
    }
  );

  const creative = await response.json();
  console.log(creative);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 — Success theme={null}
  {
    "id": 101,
    "name": "Summer Sale Promo",
    "message": "Hot deals just for you! Shop now: {{link1}} Reply STOP to opt out.",
    "offer_links": [
      {
        "key": "link1",
        "offer_id": "665f1a2b3c4d5e6f70819201",
        "url": null,
        "url_params": {"sub1": "sms"}
      }
    ],
    "offers": ["665f1a2b3c4d5e6f70819201"],
    "status": "active",
    "creative_type": "automated",
    "character_count": 114,
    "segment_count": 1,
    "created_at": "2025-06-10T12:00:00",
    "slug": "cre_summer-sale-promo_a1b2c3",
    "list_control_mode": "all",
    "list_control_ids": []
  }
  ```

  ```json 404 — Not Found theme={null}
  {
    "error": "Creative not found",
    "code": "not_found"
  }
  ```

  ```json 401 — Unauthorized theme={null}
  {
    "error": "Invalid credentials",
    "code": "invalid_credentials"
  }
  ```
</ResponseExample>

## Error Codes

| HTTP Status | Error Code            | Description                                                                |
| ----------- | --------------------- | -------------------------------------------------------------------------- |
| 401         | `invalid_credentials` | API key is missing or invalid.                                             |
| 403         | `account_suspended`   | Your account is suspended. Resolve outstanding billing or contact support. |
| 429         | `rate_limited`        | Request throttled; retry with exponential backoff after the window resets. |
| 404         | `not_found`           | No creative exists with the given ID.                                      |

## Next Steps

<CardGroup cols={2}>
  <Card title="Creative Templates" icon="paintbrush" href="/guides/creatives/templates">
    Design effective templates
  </Card>

  <Card title="Create Schedule" icon="calendar" href="/api-reference/v2/schedules/create-schedule">
    Use creatives in campaigns
  </Card>
</CardGroup>
