How do I create and edit content entries?
Content entries are the individual pieces of content in your CMS — like a single blog post, help article, or product description. Here's how to create and edit them.
Creating a new entry #
Via the dashboard #
- Go to your project's Content tab
- Select the content model (e.g., "Help Article")
- Click "New entry"
- Fill in the title and body
- Add values for any custom fields
- Click Save (saves as draft) or Publish
Via MCP (AI agents) #
Writing content goes through the dashboard or MCP — the Content API at content.better-i18n.com is read-only, so there is no POST to create an entry with. An agent calls createContentEntry:
{
"modelSlug": "help-article",
"title": "How to get started",
"bodyMarkdown": "## Overview\n\nWelcome...",
"customFields": { "category": "setup", "order": 1 }
}Creating with multiple languages at once #
Include all translations in the initial create call — creating first and then looping one update per language costs an extra call per language for the same result:
{
"modelSlug": "help-article",
"title": "How to get started",
"bodyMarkdown": "## Overview\n\n...",
"translations": {
"tr": { "title": "Nasıl başlanır", "bodyMarkdown": "## Genel Bakış\n\n..." },
"fr": { "title": "Comment démarrer", "bodyMarkdown": "## Présentation\n\n..." }
}
}For many entries at once, bulkCreateEntries takes up to 200 per call and reports partial failures in a failed array.
Editing an existing entry #
Via the dashboard #
- Click the entry in the content list
- Edit the title, body, or custom fields
- Use the language switcher to edit each language
- Click Save or Publish
Via MCP #
updateContentEntry with the entry id and the fields you want to change. Only what you pass is touched.
Editing a published entry edits the live content. There is no draft copy sitting in front of a published one: the save writes through and the Content API cache is purged, so the next request serves your edit. If the model has version history enabled, each save snapshots the previous revision per language, which is what you fall back on — not an unpublished staging copy. When you want to work on something without it being live, keep the entry itself in draft until it is ready.
Markdown body guidelines #
- Do NOT start with
# H1— the entry title is already rendered as the page H1 - Start your body with a paragraph or
## H2section - Tables, code blocks, and images are all supported
- Keep headings hierarchical (H2 → H3, not H2 → H4)
Slugs #
Each entry has a slug — the URL-safe identifier used in API calls and content paths. By default it's generated from the title, and you can override it in the entry settings.
One thing to know before you build URLs on it: the entry slug is a single CMS identifier shared by every language. If you need a different URL per language, add a localized custom field (for example localized_slug) and set it per language.
Publishing vs. drafts #
- Draft — visible in the dashboard,
publishedAtnot stamped - Published — marked live,
publishedAtstamped, cache purged
Note that the Content API does not filter by status unless you ask it to. A request without ?status=published returns drafts alongside live entries, so add the filter in the app that reads them. See How do I publish content entries?.
Deleting entries #
Deleting an entry — from the dashboard's three-dot menu, or by an agent calling deleteContentEntry — moves it to Trash. It stops being served, and it can be restored (that is what the Undo action does).
Permanently removing an entry is a separate action, and that one is irreversible: it takes the translations, field values and version history with it.
Better I18N