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

# Elements

> An element is one piece of content Curious optimizes as a whole, named by you; what makes something one element or two, and what element_type does.

An **element** is one piece of content you want optimized, named by you in the `element` field: `welcome_email_subject`, `pricing_hero`, `paywall`. Every `decide` and `declare` call names exactly one element, and every decision is made for one.

## One element or two

The element is the unit of optimization: Curious chooses one arm for it, holistically. If an email's subject and body should be optimized together, that is one element whose content has two fields, and every variant is a subject and a body that belong together. If they should be optimized independently, they are two elements, each with its own experiment.

```json theme={null}
{ "element": "welcome_email", "control": { "content": { "subject": "Welcome", "body": "Thanks for joining." } } }
```

```json theme={null}
{ "element": "welcome_email_subject", "control": "Welcome" }
```

Composition lives in the content's shape, not in a hierarchy of elements: an email series or a carousel is one element whose [format](https://docs.trycurious.ai/concepts/format.md) has an array field. There are no sub-elements.

## Naming

Names are strings of your choosing, matched exactly. Name the surface, not the experiment: `pricing_hero`, not `pricing_hero_test_2`. The name is how your code and the dashboard refer to the same thing for as long as the content exists, across every experiment Curious runs on it.

## `element_type`

An optional `element_type` tells Curious what kind of content it is writing, so it brings the right craft knowledge to variant generation: what a push notification can carry, how an email subject earns an open, what a paywall must say. The values are:

`push_notification`, `email_subject`, `email_preview`, `email_body`, `email`, `button_cta`, `hero`, `landing_page`, `blog_post`, `paywall`

Case does not matter on input. Any other value is a `400` naming the allowed set. The type never constrains the content's shape; a provided control is the ground truth about what your renderer displays. Changing the type updates the element in place and shapes future variants without restarting anything.

## Elements and experiments

An element outlives its experiments. The first declaration creates an experiment; a later declaration that changes what the variants were generated against concludes it and starts a successor on the same element, and the dashboard shows the chain. You never manage experiments by id. See [Declarations](https://docs.trycurious.ai/concepts/declarations.md) and [The experiment lifecycle](https://docs.trycurious.ai/concepts/lifecycle.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.