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

# Using these files

> Install and use the Octavia AI CMS agent skill, llms.txt and the example projects from a coding agent.

Three artifacts exist so a coding agent can work against this API without guessing.
They differ in size and purpose, and an agent needs at most two of them at a time.

| **File**                                           | **Size** | **What it is**                                                       |
| -------------------------------------------------- | -------- | -------------------------------------------------------------------- |
| [`llms.txt`](/api-reference/ai-cms/llms/llms.txt)  | Small    | A map of the whole API. Non-negotiables plus every endpoint grouped. |
| [Agent skill](/api-reference/ai-cms/sdks/skill)    | Medium   | Rules that prevent specific wrong code. Read before writing a call.  |
| [Example projects](/api-reference/ai-cms/examples) | Large    | Eight runnable apps. Check your output against a working one.        |

<Note>
  All three are <strong>AI CMS only</strong>. They describe this API and nothing else
  on the platform.
</Note>

***

## Which one to load

**You are writing code that calls this API.** Load the [agent skill](/api-reference/ai-cms/sdks/skill). It is the only artifact
that tells you what the SDKs actually do, including the places where they disagree with
each other and the two bugs you need to route around. Reading the endpoint list instead
will get you a plausible request that fails.

**You are planning, or you need to know what exists.** Load `llms.txt`. It answers
"is there an endpoint for repurpose?" in one read.

**You want to check your work.** Look at the matching
[example project](/api-reference/ai-cms/examples) — eight of them run the same sequence
in different stacks.

***

## The skill file

The skill is maintained in the public SDK repository, so it is versioned and
installable rather than copy-pasted:

```
https://github.com/octaviatech/octavia-ai-cms
└── .claude/skills/octavia-cms/SKILL.md
```

Download it directly:

```bash theme={null}
curl -sL https://raw.githubusercontent.com/octaviatech/octavia-ai-cms/main/.claude/skills/octavia-cms/SKILL.md
```

<Card title="Download SKILL.md" icon="download" href="https://raw.githubusercontent.com/octaviatech/octavia-ai-cms/main/.claude/skills/octavia-cms/SKILL.md">
  The complete skill, as a plain file
</Card>

***

## Installing it

### Claude Code — recommended

The repository already contains the skill at `.claude/skills/octavia-cms/`, so
cloning it into your project installs the skill:

```bash theme={null}
git clone https://github.com/octaviatech/octavia-ai-cms.git
cd octavia-ai-cms
```

Then work in that checkout. The skill is discovered on startup and loaded whenever a
request matches its description — articles, categories, forms, the AI endpoints, or
reports.

To use it from a different project, copy just the skill directory:

```bash theme={null}
mkdir -p .claude/skills
cp -r octavia-ai-cms/.claude/skills/octavia-cms .claude/skills/
```

Verify it is picked up:

```bash theme={null}
ls .claude/skills/octavia-cms/SKILL.md
```

<Note>
  The file must be named <code>SKILL.md</code> and sit at{" "}
  <code>.claude/skills/\<name>/SKILL.md</code>. The <code>name</code> and{" "}
  <code>description</code> in its frontmatter are what the agent matches against, so
  keep the description naming the resources you actually use.
</Note>

### Any other agent

The same file works as a system-prompt section, a tool description, or a
retrieval-document chunk. It is written as rules rather than prose precisely so it
survives being pasted into any of those without editing.

For a hosted model with no filesystem, paste the block from the
[agent skill page](/api-reference/ai-cms/sdks/skill) verbatim as a system message.
Keep it whole — the rules reference each other, and the pagination rule is meaningless
without the envelope rule above it.

***

## Fetching the map

```bash theme={null}
# The map — safe to fetch first, it is small
curl -s https://developers.octaviatech.app/api-reference/ai-cms/llms/llms.txt
```

***

## What the skill is protecting you from

Each rule in the skill exists because ignoring it produces code that compiles and then
fails at runtime. The three that bite hardest:

**The wrong headers.** The only header is `x-api-key`. `x-tenant-id`,
`x-service-status`, `x-user-id` and `Authorization` are set by the gateway from the
key, and no SDK accepts them. If you generate code that sets them, the request is
wrong and the habit is now in your codebase.

**Pagination in the wrong place.** `pagination` is inside `data`, not beside it:

```ts theme={null}
// wrong
const total = res.pagination.total;

// right
const total = res.data.pagination.total;
```

And the row key is per-resource — `articleListItem` for articles but `author` for
authors, `items` for statistics pages.

**The facade is not the wire.** There are two result shapes, and PHP is the outlier
with no wrapper at all. Code written against JavaScript's `res.ok` and
`res.error.message` is wrong in PHP, and `res.meta` does not exist there.

***

## A worked example

Given: "add a contact form to our Next.js app and send submissions to the CMS."

An agent that loads only `llms.txt` will find the forms endpoints and write something
like:

```ts theme={null}
// What you get without the skill
const forms = await cms.form.getAll();
const formId = forms.data[0].id; // undefined — getAll has no id
```

`getAll` returns only a submissions count per form, with no id or title, so it cannot
drive a picker.

An agent that loads the skill writes:

```ts theme={null}
// The form id is entered by the user, then fetched by id
const form = await cms.form.getById(formId);
if (!form.ok) throw new Error(form.error?.message ?? "Could not load form");

// Submit: fields go inside `values`
const res = await cms.formSubmission.idSubmit(formId, {
  language: "en",
  values: { email },
});
```

***

## Keeping it current

The skill lives in the SDK repository, so it is updated in the same commit as the SDK
and the spec. Pull it to pick up changes:

```bash theme={null}
git pull
```

If you find code that contradicts the skill, that is a bug in one of the two — and
worth reporting, because every agent that reads the file will make the same mistake.

<CardGroup cols={2}>
  <Card title="Agent skill" icon="robot" href="/api-reference/ai-cms/sdks/skill" arrow="true">
    The skill itself
  </Card>

  <Card title="Example projects" icon="code" href="/api-reference/ai-cms/examples" arrow="true">
    Working code in eight stacks
  </Card>
</CardGroup>
