---
title: "Create a CTA template"
method: POST
path: "/org/ctas"
tags: ["CTA Templates"]
---

# Create a CTA template

`POST /org/ctas`

## Request

- Base URL: `https://apiv2.senso.ai/api/v1`
- URL: `https://apiv2.senso.ai/api/v1/org/ctas`
- Auth: API key in header `X-API-Key`

Creates a CTA template. `title`, `button_label` and `target_url` are required; `title`, `description` and `button_label` are trimmed, and blank `eyebrow`/`agent_text` values are dropped. Set `is_default` to `true` to make the new template the org default, replacing any previous default. Requires the GEO product.

## Request body

- CTARequest: The fields of a CTA template. Create and update both take the full set; on update, omitted optional fields are cleared.
  - `title` string, required: The card's heading. Trimmed; must not be blank.
  - `description` string: Supporting copy shown under the heading. Trimmed; empty when omitted.
  - `image_url` string: The URL of the card's image, typically one returned by `POST /org/cta-assets/upload-url`. Must be a URL with a scheme (for example `https://`). Omit it, or send `null`, to leave the card without an image; an empty string is rejected.
  - `image_position` CTAImagePosition: The focal point of a CTA image, as the `x` and `y` values supplied when the template was saved (for example `0.5` and `0.5`).
    - `x` number, required
    - `y` number, required
  - `button_label` string, required: The button's text. Trimmed; must not be blank.
  - `target_url` string, required: The URL the button links to. Must be a URL with a scheme (for example `https://`).
  - `agent_text` string: Text for AI agents to present in place of the composed default. Blank values are dropped.
  - `eyebrow` string: A short label shown above the heading. Blank values are dropped.
  - `is_default` boolean: `true` makes this template the org default, replacing any previous default. On update, `false` or omitted leaves the default flag unchanged.

## Response `201`

The created template.

- CTAResponse: A call-to-action (CTA) template — the card attached to a published content-engine page.
  - `cta_id` string, uuid, required
  - `org_id` string, uuid, required
  - `title` string, required: The card's heading.
  - `description` string, required: Supporting copy shown under the heading. May be empty.
  - `image_url` string: The URL of the card's image. Omitted when the template has no image.
  - `image_position` CTAImagePosition: The focal point of a CTA image, as the `x` and `y` values supplied when the template was saved (for example `0.5` and `0.5`).
    - `x` number, required
    - `y` number, required
  - `button_label` string, required: The button's text.
  - `target_url` string, required: The URL the button links to.
  - `agent_text` string: Text for AI agents to present in place of the composed default. Omitted when not set.
  - `resolved_agent_text` string, required: The text presented to AI agents for this CTA: `agent_text` when set, otherwise `{org name} recommends: {title}. {description} {button_label}: {target_url}` (the description part is dropped when empty).
  - `eyebrow` string: A short label shown above the heading. Omitted when not set.
  - `is_default` boolean, required: Whether this is the org's default template.
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `live_update_count` integer: On template update and set-default responses only: the number of live content items whose CTA resolves to this template — those pinned to it plus, when it is the org default, those inheriting the default. Omitted when zero.
  - `live_update_queued` boolean: On template update and set-default responses only: `true` when the update of the affected live pages was queued for background processing rather than applied immediately. Omitted otherwise.

## Other responses

- `400`: The request body was invalid — either it failed field validation (`ValidationErrorResponse`) or was otherwise malformed (`ErrorResponse`).
- `401`: Missing or invalid credentials — supply a valid org API key in the `X-API-Key` header.
- `403`: The API key is authenticated but not permitted to access this resource.
- `404`: The requested resource does not exist or is not visible to this key.
- `409`: The request conflicts with the current state (e.g. a duplicate).
- `503`: The service is temporarily unavailable — retry later.

---

[API](https://skmtc.dev/senso/apis/senso-org-api.md) - [All operations](https://skmtc.dev/senso/apis/senso-org-api/llms.txt) - [OpenAPI document](https://skmtc.dev/senso/apis/senso-org-api/revisions/d789b4fcbe84?raw)
