Skip to content

Content

Admin

Content groups 10 operations on the admin tier.

Admin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

GET

/api/{version}/admin/content/pages

One cursored page of content pages, published or not, in the request's active language. Follow the Link: rel="next" header for the next page; a page_info that was not issued for this exact query string is rejected with 422.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Query parameters

NameTypeDescription
limit
optional
integer (int32)

Responses

curl -X GET \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/pages' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'
Response200example shape
{
  "pages": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "handle": "string",
      "title": "string",
      "body_html": "string",
      "published": true,
      "template": "string",
      "type": "string",
      "show_in_header": true,
      "show_in_footer": true,
      "sort_order": 1,
      "meta_description": "string",
      "meta_keywords": "string",
      "menu_title": "string",
      "created_at": "2026-04-01T12:00:00Z",
      "updated_at": "2026-04-01T12:00:00Z"
    }
  ]
}
POST

/api/{version}/admin/content/pages

Creates a page in the active language and returns it as stored. A missing body and a rejected field both surface as 422.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Request body

application/json, text/json, application/*+json · optional

CreatePageRequest

Body for POST content/pages. handle is required; type defaults to common.

  • handlestringnullable
  • titlestringnullable
  • body_htmlstringnullable
  • publishedboolean
  • templatestringnullable
  • typestringnullable
  • show_in_headerboolean
  • show_in_footerboolean
  • sort_orderinteger (int32)
  • meta_descriptionstringnullable
  • meta_keywordsstringnullable
  • menu_titlestringnullable

Responses

curl -X POST \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/pages' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "handle": "string",
  "title": "string",
  "body_html": "string",
  "published": true,
  "template": "string",
  "type": "string",
  "show_in_header": true,
  "show_in_footer": true,
  "sort_order": 1,
  "meta_description": "string",
  "meta_keywords": "string",
  "menu_title": "string"
}'
Response201example shape
{
  "page": {
    "id": "00000000-0000-0000-0000-000000000000",
    "handle": "string",
    "title": "string",
    "body_html": "string",
    "published": true,
    "template": "string",
    "type": "string",
    "show_in_header": true,
    "show_in_footer": true,
    "sort_order": 1,
    "meta_description": "string",
    "meta_keywords": "string",
    "menu_title": "string",
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
GET

/api/{version}/admin/content/pages/{id}

One content page in the active language.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Responses

curl -X GET \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/pages/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'
Response200example shape
{
  "page": {
    "id": "00000000-0000-0000-0000-000000000000",
    "handle": "string",
    "title": "string",
    "body_html": "string",
    "published": true,
    "template": "string",
    "type": "string",
    "show_in_header": true,
    "show_in_footer": true,
    "sort_order": 1,
    "meta_description": "string",
    "meta_keywords": "string",
    "menu_title": "string",
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
PUT

/api/{version}/admin/content/pages/{id}

Applies the supplied fields to the page in the active language and returns it as stored.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Request body

application/json, text/json, application/*+json · optional

UpdatePageRequest

Body for PUT content/pages/{id}. Every field is optional; only the supplied ones are applied.

  • handlestringnullable
  • titlestringnullable
  • body_htmlstringnullable
  • publishedbooleannullable
  • templatestringnullable
  • typestringnullable
  • show_in_headerbooleannullable
  • show_in_footerbooleannullable
  • sort_orderinteger (int32)nullable
  • meta_descriptionstringnullable
  • meta_keywordsstringnullable
  • menu_titlestringnullable

Responses

curl -X PUT \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/pages/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "handle": "string",
  "title": "string",
  "body_html": "string",
  "published": true,
  "template": "string",
  "type": "string",
  "show_in_header": true,
  "show_in_footer": true,
  "sort_order": 1,
  "meta_description": "string",
  "meta_keywords": "string",
  "menu_title": "string"
}'
Response200example shape
{
  "page": {
    "id": "00000000-0000-0000-0000-000000000000",
    "handle": "string",
    "title": "string",
    "body_html": "string",
    "published": true,
    "template": "string",
    "type": "string",
    "show_in_header": true,
    "show_in_footer": true,
    "sort_order": 1,
    "meta_description": "string",
    "meta_keywords": "string",
    "menu_title": "string",
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
DELETE

/api/{version}/admin/content/pages/{id}

Deletes the page in every language. Returns 204 with no body; deleting an already-deleted page is a 404, not a no-op success.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Responses

curl -X DELETE \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/pages/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'
GET

/api/{version}/admin/content/articles

One cursored page of blog articles, published or not, in the request's active language. Follow the Link: rel="next" header for the next page; a page_info that was not issued for this exact query string is rejected with 422.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Query parameters

NameTypeDescription
limit
optional
integer (int32)

Responses

curl -X GET \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/articles' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'
Response200example shape
{
  "articles": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "title": "string",
      "summary_html": "string",
      "body_html": "string",
      "published": true,
      "image": {
        "id": "00000000-0000-0000-0000-000000000000",
        "src": "string",
        "preview_src": "string",
        "alt": "string",
        "position": 1,
        "width": 1,
        "height": 1
      },
      "created_at": "2026-04-01T12:00:00Z",
      "updated_at": "2026-04-01T12:00:00Z"
    }
  ]
}
POST

/api/{version}/admin/content/articles

Creates a blog article in the active language and returns it as stored. A missing body and a rejected field both surface as 422.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Request body

application/json, text/json, application/*+json · optional

CreateArticleRequest

Body for POST content/articles. title is required.

  • titlestringnullable
  • summary_htmlstringnullable
  • body_htmlstringnullable
  • publishedboolean

Responses

curl -X POST \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/articles' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "string",
  "summary_html": "string",
  "body_html": "string",
  "published": true
}'
Response201example shape
{
  "article": {
    "id": "00000000-0000-0000-0000-000000000000",
    "title": "string",
    "summary_html": "string",
    "body_html": "string",
    "published": true,
    "image": {
      "id": "00000000-0000-0000-0000-000000000000",
      "src": "string",
      "preview_src": "string",
      "alt": "string",
      "position": 1,
      "width": 1,
      "height": 1
    },
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
GET

/api/{version}/admin/content/articles/{id}

One blog article in the active language.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Responses

curl -X GET \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/articles/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'
Response200example shape
{
  "article": {
    "id": "00000000-0000-0000-0000-000000000000",
    "title": "string",
    "summary_html": "string",
    "body_html": "string",
    "published": true,
    "image": {
      "id": "00000000-0000-0000-0000-000000000000",
      "src": "string",
      "preview_src": "string",
      "alt": "string",
      "position": 1,
      "width": 1,
      "height": 1
    },
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
PUT

/api/{version}/admin/content/articles/{id}

Applies the supplied fields to the article in the active language and returns it as stored.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Request body

application/json, text/json, application/*+json · optional

UpdateArticleRequest

Body for PUT content/articles/{id}. Every field is optional; only the supplied ones are applied.

  • titlestringnullable
  • summary_htmlstringnullable
  • body_htmlstringnullable
  • publishedbooleannullable

Responses

curl -X PUT \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/articles/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>' \
  -H 'Content-Type: application/json' \
  -d '{
  "title": "string",
  "summary_html": "string",
  "body_html": "string",
  "published": true
}'
Response200example shape
{
  "article": {
    "id": "00000000-0000-0000-0000-000000000000",
    "title": "string",
    "summary_html": "string",
    "body_html": "string",
    "published": true,
    "image": {
      "id": "00000000-0000-0000-0000-000000000000",
      "src": "string",
      "preview_src": "string",
      "alt": "string",
      "position": 1,
      "width": 1,
      "height": 1
    },
    "created_at": "2026-04-01T12:00:00Z",
    "updated_at": "2026-04-01T12:00:00Z"
  }
}
DELETE

/api/{version}/admin/content/articles/{id}

Deletes the article in every language. Returns 204 with no body; deleting an already-deleted article is a 404.

AuthenticationToken requiredAdmin tier. Requires an RBAC-gated vnstat_ access token, sent as Authorization: Bearer … or X-Vinosoft-Access-Token.

Path parameters

NameTypeDescription
id
required
string (uuid)

Responses

curl -X DELETE \
  'https://<your-shop-domain>/api/2026-04-01/admin/content/articles/<id>' \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer vnstat_<token>'

Schemas

ApiErrorResponse

The error envelope every non-2xx response from this API uses. Documentation shape: actions build it as an anonymous object, so this type exists to give the OpenAPI document a schema to point at.

  • errorsstringnullable

    Human-readable description of what went wrong, e.g. Not Found, Invalid page_info.

  • codestringnullable

    Machine-readable error code. Only a few endpoints (checkout) emit one; omitted everywhere else.

ArticleDto

Admin representation of a blog article (the content/articles resource, backed by the existing News domain). Serialized snake_case. Single-active-language design: title/summary_html/ body_html are flat values for the request's active language. News has no handle, so none is exposed.

  • idstring (uuid)
  • titlestringnullable
  • summary_htmlstringnullable
  • body_htmlstringnullable
  • publishedboolean
  • created_atstring (date-time)
  • updated_atstring (date-time)nullable

ArticleListResponse

Envelope returned by GET /admin/content/articles. Cursored exactly like Cloudwawi.Shop.Api.V2026_04_01.PageListResponse; the two cursors are not interchangeable.

  • articlesArticleDto[]nullable

    The page of blog articles, published or not, each in the request's active language. Always present; an empty array when the tenant has none.

ArticleResponse

Envelope returned by GET /admin/content/articles/{id}, POST /admin/content/articles (201) and PUT /admin/content/articles/{id}.

CreateArticleRequest

Body for POST content/articles. title is required.

  • titlestringnullable
  • summary_htmlstringnullable
  • body_htmlstringnullable
  • publishedboolean

CreatePageRequest

Body for POST content/pages. handle is required; type defaults to common.

  • handlestringnullable
  • titlestringnullable
  • body_htmlstringnullable
  • publishedboolean
  • templatestringnullable
  • typestringnullable
  • show_in_headerboolean
  • show_in_footerboolean
  • sort_orderinteger (int32)
  • meta_descriptionstringnullable
  • meta_keywordsstringnullable
  • menu_titlestringnullable

PageDto

Admin representation of a content page (the content/pages resource, backed by the existing StaticPage domain). Serialized snake_case via explicit [JsonPropertyName] attributes, because the host's global JSON policy is camelCase. Single-active-language design: title/body_html/meta are flat values for the request's active language, not a translations map.

  • idstring (uuid)
  • handlestringnullable

    URL slug (the domain Url); unique within the tenant.

  • titlestringnullable
  • body_htmlstringnullable
  • publishedboolean

    Whether the page is visible on the storefront.

  • templatestringnullable

    Storefront template override; null for the default.

  • typestringnullable

    Page kind: common (HTML) or liquid (rendered template).

  • show_in_headerboolean
  • show_in_footerboolean
  • sort_orderinteger (int32)
  • meta_descriptionstringnullable
  • meta_keywordsstringnullable
  • menu_titlestringnullable
  • created_atstring (date-time)
  • updated_atstring (date-time)nullable

PageListResponse

Envelope returned by GET /admin/content/pages. One page of content pages. Paging is cursored: when more exist, the response carries a Link header of the form <https://…?limit=50&page_info=…>; rel="next". Follow that URL verbatim — the cursor embeds a fingerprint of the query that produced the page, and a request whose query string no longer matches is rejected with 422. There is no total count and no last page link.

  • pagesPageDto[]nullable

    The page of content pages, published or not, each in the request's active language. Always present; an empty array when the tenant has none.

PageResponse

Envelope returned by GET /admin/content/pages/{id}, POST /admin/content/pages (201) and PUT /admin/content/pages/{id}.

StorefrontImageDto

Storefront representation of a product image. An image is an object (id, src, alt, position, width, height) rather than a bare URL, so clients get the gallery order, accessibility text, and intrinsic dimensions.

  • idstring (uuid)
  • srcstringnullable
  • preview_srcstringnullable
  • altstringnullable
  • positioninteger (int32)
  • widthinteger (int32)
  • heightinteger (int32)

UpdateArticleRequest

Body for PUT content/articles/{id}. Every field is optional; only the supplied ones are applied.

  • titlestringnullable
  • summary_htmlstringnullable
  • body_htmlstringnullable
  • publishedbooleannullable

UpdatePageRequest

Body for PUT content/pages/{id}. Every field is optional; only the supplied ones are applied.

  • handlestringnullable
  • titlestringnullable
  • body_htmlstringnullable
  • publishedbooleannullable
  • templatestringnullable
  • typestringnullable
  • show_in_headerbooleannullable
  • show_in_footerbooleannullable
  • sort_orderinteger (int32)nullable
  • meta_descriptionstringnullable
  • meta_keywordsstringnullable
  • menu_titlestringnullable