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

# Create Blog

> Create a new blog

# Create Blog

Creates a new blog in the store.

**Auth:** app access token with the `write_content` scope.

## Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.launchmystore.io/api/v1/blogs.json" \
    -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "company-news",
      "title": "Company News"
    }'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch('https://api.launchmystore.io/api/v1/blogs.json', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'company-news',
      title: 'Company News'
    })
  });
  ```
</CodeGroup>

The body may be sent either flat (fields at the top level) or wrapped in a
`blog` object (`{ "blog": { ... } }`) — both are accepted.

## Body Parameters

<ParamField body="name" type="string" required>
  The blog's internal name. Required.
</ParamField>

<ParamField body="title" type="string" required>
  The blog title. Required.
</ParamField>

<ParamField body="handle" type="string">
  URL-safe handle.
</ParamField>

<ParamField body="templateSuffix" type="string">
  Custom template suffix for theming (e.g. `news`).
</ParamField>

<Note>
  Only the fields above are persisted. Any other field in the body — including
  `commentable`, `feedburner`, `feedburner_location`, `tags`, and
  `articles_count` — is silently ignored on this endpoint and will not appear in
  the response. Comment moderation is not configurable through this API.
</Note>

## Response

The response uses the standard platform envelope. The created blog row is
returned under `data.blog`.

<ResponseField name="status" type="integer">HTTP status code (`201` on success).</ResponseField>
<ResponseField name="state" type="string">`"success"` or `"error"`.</ResponseField>

<ResponseField name="data.blog" type="object">
  The created blog row: `blogsPageId`, `id`, `name`, `title`, `handle`,
  `templateSuffix`, `seoTitle`, `seoDesc`, `seoImage`, `storeId`, plus
  `createdAt` / `updatedAt` timestamps.
</ResponseField>

## Example Response

```json theme={null}
{
  "status": 201,
  "state": "success",
  "message": null,
  "data": {
    "blog": {
      "blogsPageId": "5a0e8d2c-8c0e-4e26-9f70-3bd2bce29c11",
      "id": "482910",
      "name": "company-news",
      "title": "Company News",
      "handle": null,
      "templateSuffix": null,
      "seoTitle": null,
      "seoDesc": null,
      "seoImage": null,
      "storeId": "f73049dc-b4d4-4f85-99c2-681a5e351a8a",
      "createdAt": "2026-03-20T10:00:00.000Z",
      "updatedAt": "2026-03-20T10:00:00.000Z"
    }
  },
  "count": null,
  "pagination": null
}
```

## Errors

A missing `name` or `title` returns the error envelope:

```json theme={null}
{
  "status": 400,
  "state": "error",
  "message": "Missing required fields: name, title",
  "data": null
}
```

| Code  | Description                                              |
| ----- | -------------------------------------------------------- |
| `400` | `name` and/or `title` missing or not a non-empty string. |
| `401` | Invalid or missing access token.                         |
| `403` | App lacks the `write_content` scope.                     |
