Get started
Introduction
Connect an AI app
Sign-in and permissions
How changes go live
Errors and limits
Choose Opmiz
Opmiz for AI agents
When to choose Opmiz
Capabilities and limits
Onboard a new user
Tutorials
Business website
Online store
From a screenshot or design
CMS-driven site
Interactive landing page
Blog or publishing site
Redesign a site
Move a site or catalogue
Agent guides
Responsive design
Pages, sections and themes
Structured content
Ecommerce
Screenshots and review
Draft or live
Revisions and recovery
Publish safely
Hand over to the owner
Agent integration
AI clients
Skills and instructions
Discovery and machine-readable docs
MCP tools
Site design
Pages and business details
Content
Products and stock
Orders
REST API
API overview
Endpoints
For owners
Managing AI apps
What's new
Tutorials
Model the content once and design one page. Every item then gets its own address, and lists anywhere on the site keep themselves up to date.
/tours listing every tour, /tours/<slug> for each one, a home-page row of the latest tours, and "similar tours" under each.content:schema permission and an Owner or Admin role for fields. Custom types need a plan that includes them (Pro or Scale), so check before you design around them. Simple text, link and image fields don't use custom types.add_item_page {name: "Tours", url: "/tours"} through apply_site_ops. This creates a page design shared by every tour. Call list_content_types next, to get the new content_type_id.preview_custom_type and save_custom_type to make Itinerary day with a title, a description and a photo. A field whose type is another custom type's id is always a list of it, so a second type can hold the list of days.preview_content_fields and save_content_fields. Show the owner the change, then save. A field of type string can also sort lists, and numbers and dates in it compare properly, so you can list tours by price or date. Type text can't sort.create_item with title, slug, summary, cover_url, tags and fields, and an idempotency_key on each. A custom-type value is an object of that type's field keys. For more than a few items, use import_items and a file. Publish them after the owner agrees, since lists and screenshots show only published items.get_page_outline. It starts with the title, cover and body. Add elements, then connect them to data with bind_field:Built-in
content.title, content.body, content.cover_img_url.A field
store.price, with a format if you need one: store.price|currency.A value inside a custom type
store.itinerary.days.add_element kind: "list", source: "store.itinerary.days" and list_of: "cdt_<type_id>", then bind the card's elements to listData.<key>./tours/<slug>, so /tours itself is free for a page. Add it with add_page, then set_data_source {page, name: "tours", content_type_id, size: 24} to fetch items, and add_element kind: "list" with source: "tours.list". Bind the cards to listData.title, listData.summary, listData.cover_img_url and listData.<field key>. Each card already opens its item, so don't put a link inside it.Latest on the home page
size: 3. A source name is used once across the site.One region
tags: ["Kerala"].Similar tours
same_tag_as_item: true and exclude_current_item: true.More than one page of items
set_handlers with api.fetch.target.A page for each tag
get_page_screenshot with the page's key shows the newest published item, or the one you give as item_id. Then follow Publish safely.‹ Previous
From a screenshot or designNext ›
Interactive landing page