# Build your site on the MooverApp API

import { LandingPage } from "zudoku/components";
import { BotIcon, LayoutTemplateIcon, TerminalIcon } from "zudoku/icons";

{/* `mvr-landing` is what src/portal.css hides the frame's own <h1> by: the hero carries
    the page's headline, and the frontmatter title above it is the same page announcing
    itself twice. The title itself stays — it is the browser tab, the .md twin's heading
    and the llms.txt entry. */}

<LandingPage
  className="mvr-landing"
  eyebrow="MooverApp for developers"
  title={<>Your store, assembled by <span className="text-primary">API calls</span></>}
  description="Accounts, websites, pages and blocks, blog, media, themes, views and settings — every one of them a resource with the same five methods. The admin interface is written against exactly this surface, so there is nothing it can do that your code cannot."
  actions={[
    { label: "Quickstart", href: "/guides/quickstart" },
    { label: "Tenant API", href: "/tenant-api", variant: "outline" },
  ]}
  features={[
    {
      icon: <TerminalIcon />,
      title: "First call in five minutes",
      description:
        "Ten steps from an empty account to a page on a live domain, as one script you can run.",
      href: "/guides/quickstart",
    },
    {
      icon: <LayoutTemplateIcon />,
      title: "Build a storefront",
      description:
        "Pages, blocks, menus, blog, media, themes and per-language views — the whole reference, generated from the running service.",
      href: "/tenant-api",
    },
    {
      icon: <BotIcon />,
      title: "Connect an agent",
      description:
        "Every site the platform renders ships a read API, Markdown twins, an MCP endpoint and a discovery catalog.",
      href: "/agents",
    },
  ]}
/>

## What you can rely on

Every surface follows one standard: five standard methods on named resources, `snake_case`
bodies, the same paging, filtering and ordering parameters on every list, one error shape,
`etag`/`If-Match` for concurrency, and an Operation to poll whenever the work outlives the
call. Learn it once on one resource and you can predict the next one — which is what
[Concepts](/concepts/overview) is for.

## Why this page cannot go stale

This documentation is generated from the declarations the running service is built from,
in the same build that produces the running service, and shipped by the same release.
There is no synchronisation step to forget: the description of an endpoint and the code
that answers it are one commit. Rename a field and the page describing it changes with it
— or the build fails.

The requests in the guides are the same thing in the other direction: they are regions of
[one script](/quickstart.sh) that is executed, not an illustration typed into a page.
