Typed routes

Everything that is not a command is a catalog route (ROUTE_CATALOG, ADR 0027 §5): reads, provider-backed ops, draft workspace writes, owner-only actions. The catalog IS the exceptions to the command bus: the API router serves exactly these entries plus the excluded platform prefixes below, and every non-owner entry is an MCP tool under its dotted id. GET /v1/routes serves this list with JSON Schemas (the twin of GET /v1/commands).

Agent policy vocabulary

policymeaning
readGET, no store effects: every token kind calls it directly.
quotea provider call with no store-state change (offers, labels, validators): every token kind calls it directly.
workspacewrites confined to the caller's own draft workspace or staging: every token kind executes it directly.
proposea live mutation: an Ajan token's call is recorded into its open proposal (202 proposed: true); a Geliştirici token executes it directly.
ownerowner sessions only: never callable by any token and never an MCP tool.

Catalog

routemethod + pathpolicysummary
meta.getGET /v1/metareadPlatform build identity and compatibility fingerprint (buildId, registryHash, minCli).
commands.listGET /v1/commandsreadList commands with JSON Schemas; anonymous callers see the frozen core set, authenticated callers the scope-filtered registry.
commands.runPOST /v1/commandsproposeRun one command envelope {command, storeId, payload, idempotencyKey|dryRun}.
routes.listGET /v1/routesreadList typed routes with JSON Schemas (the twin of commands.list).
sections.meta.getGET /v1/sections/metareadSection catalog with props/blocks JSON Schemas and placement rules.
store.health.getGET /v1/store/healthreadStore readiness checklist (draft/live, identity, flags).
store.identity.getGET /v1/store/identityreadLegal identity block (owner-only).
store.checkoutSettings.getGET /v1/store/checkout-settingsreadCheckout settings (owner-only).
extensions.listGET /v1/extensionsreadInstalled + available extensions with config, secrets state and manifest UI hints (owner-only).
extensions.ops.getGET /v1/extensions/{ext}/opsreadThe extension's agent contract with LIVE readiness: every op, what it needs (secrets/config/enabled), and exactly what blocks it right now. Secrets appear as keys only.
metafields.definitions.listGET /v1/metafields/definitionsreadMetafield definitions (owner-only).
catalog.products.listGET /v1/catalog/productsreadList products (keyset cursor, filters).
catalog.products.getGET /v1/catalog/products/{prd}readGet one product with variants, media and stock.
catalog.stockMovements.listGET /v1/catalog/stock-movementsreadStock ledger rows for a product or variant.
catalog.collections.listGET /v1/catalog/collectionsreadList collections.
catalog.collections.getGET /v1/catalog/collections/{col}readGet one collection with members.
catalog.categories.listGET /v1/catalog/categoriesreadList categories.
media.listGET /v1/mediareadList media objects.
media.uploadPOST /v1/media/uploadworkspaceStage a binary upload (raw body); commit with catalog.media.commit.
orders.listGET /v1/ordersreadList orders.
orders.getGET /v1/orders/{ord}readGet one order with lines, payment, shipments, returns, timeline.
orders.belge.getGET /v1/orders/{ord}/belge/{belge}readFetch a legal document snapshot of an order.
orders.note.addPOST /v1/orders/{ord}/notproposeAdd a merchant note to the order timeline.
orders.cod.collectPOST /v1/orders/{ord}/tahsilatproposeMark a cash-on-delivery order as collected.
orders.refundPOST /v1/orders/{ord}/refundproposeRefund part or all of a captured payment through the original PSP extension.
orders.cargo.offersPOST /v1/orders/{ord}/cargo/offersquoteCreate a provider quote for the order and return carrier offers (no store mutation).
orders.cargo.bookPOST /v1/orders/{ord}/cargo/bookproposeAccept a carrier offer, create the label and ship the order.
orders.cargo.shipPOST /v1/orders/{ord}/cargo/shipproposeShip with the merchant's own carrier (manual tracking).
orders.shipment.trackPOST /v1/orders/{ord}/cargo/{shp}/trackproposeRecord a shipment status transition by hand.
orders.shipment.updatePOST /v1/orders/{ord}/cargo/{shp}/updateproposePoll the provider and apply the current tracking status.
orders.shipment.cancelPOST /v1/orders/{ord}/cargo/{shp}/cancelproposeCancel a shipment before pickup.
orders.shipment.labelPOST /v1/orders/{ord}/cargo/{shp}/labelquoteFetch the shipping label URL from the provider.
cargo.carriers.listGET /v1/cargo/carriersreadPlatform carrier reference table (codes, labels, tracking availability).
returns.listGET /v1/returnsreadList return requests.
returns.getGET /v1/returns/{ret}readGet one return request.
returns.approvePOST /v1/returns/{ret}/onaylaproposeApprove a return request with shipping instructions; mails the shopper.
returns.rejectPOST /v1/returns/{ret}/reddetproposeReject a return request with a reason; mails the shopper.
ext.cargo.senderPOST /v1/ext/{ext}/cargo/senderproposeCreate the sender address at the cargo provider and store its id in the extension config.
channel.health.getGET /v1/channel/{ext}/healthreadChannel health: credentials, last sync times, webhook state, budget/429 counters, failed batches, queue depth, unmapped orders.
channel.listings.listGET /v1/channel/{ext}/listingsreadMarketplace listings of this channel with status, effective price, pushed vs live stock, drift and last error.
channel.listings.getGET /v1/channel/{ext}/listings/{lst}readOne listing with its provider mirror (external ids, last push/remote, errors, mapping meta).
channel.sync.nowPOST /v1/channel/{ext}/syncproposeRun a sync task now (stock | price | orders | reconcile | finance | claims | questions), optionally scoped to listings.
channel.catalog.pullPOST /v1/channel/{ext}/catalog/pullproposeImport the marketplace catalog (preview or import): products, variants, images, listings, stock and prices: a durable job.
channel.catalog.pushPOST /v1/channel/{ext}/catalog/pushproposeCreate/update marketplace listings for selected products (pre-flight validated; async batch tracked).
channel.remote.productsGET /v1/channel/{ext}/remote/productsquoteThe seller's products as the marketplace sees them (approval state, remote stock/price, reject reasons).
channel.remote.categoriesGET /v1/channel/{ext}/remote/categoriesquoteMarketplace category tree search (leaf categories accept products).
channel.remote.attributesGET /v1/channel/{ext}/remote/attributesquoteAttributes a marketplace category requires/allows (required, custom, multi, variant axis).
channel.remote.attributeValuesGET /v1/channel/{ext}/remote/attribute-valuesquoteAllowed values of one category attribute.
channel.remote.brandsGET /v1/channel/{ext}/remote/brandsquoteMarketplace brand search by name.
channel.brand.createPOST /v1/channel/{ext}/remote/brandsproposeCreate a brand at the marketplace (multipart: name + 1-3 logo images).
channel.jobs.listGET /v1/channel/{ext}/jobsreadDurable channel jobs (imports, pushes, batch polls, sweeps) with progress.
channel.jobs.getGET /v1/channel/{ext}/jobs/{cjb}readOne channel job with progress, errors and result.
channel.jobs.cancelPOST /v1/channel/{ext}/jobs/{cjb}/cancelproposeCancel a queued/running channel job.
channel.package.labelPOST /v1/orders/{ord}/channel/labelquoteFetch the marketplace cargo label for a package (ZPL, or rendered PDF/PNG).
channel.package.opPOST /v1/orders/{ord}/channel/{chop}proposeAct on a marketplace package: status (preparing/invoiced), unsupplied (penalty acknowledged), split, invoice hand-off, cargo (carrier/box/warehouse/extend/own-carrier).
channel.packages.labelsPOST /v1/channel/{ext}/labelsquoteBulk labels for up to 50 packages (merged PDF).
channel.claims.listGET /v1/channel/{ext}/claimsquoteMarketplace return/cancel claims with deadlines and fault tags.
channel.claims.actPOST /v1/channel/{ext}/claims/{claim}/actproposeApprove, reject (reason + file) or raise an issue on a marketplace claim; restock per policy.
channel.questions.listGET /v1/channel/{ext}/questionsquoteCustomer questions awaiting an answer (with deadlines).
channel.questions.answerPOST /v1/channel/{ext}/questions/{qid}/answerproposeAnswer a customer question (moderated by the marketplace).
channel.finance.listGET /v1/channel/{ext}/financereadImported settlement rows (commission, cargo, fees, payouts) and per-order expected vs settled.
channel.buybox.getGET /v1/channel/{ext}/buyboxquoteBuybox rank and top prices for listings (≤100).
channel.unlockPOST /v1/channel/{ext}/unlockproposeRequest unlock of locked listings (after the price/stock cause is fixed).
channel.listing.archivePOST /v1/channel/{ext}/listings/archiveproposeArchive/unarchive listings at the marketplace (archive pushes stock 0 too).
channel.listing.deletePOST /v1/channel/{ext}/listings/deleteproposeDelete listings at the marketplace (irreversible; provider rules apply, e.g. archived > 1 day and not locked).
channel.webhook.registerPOST /v1/channel/{ext}/webhookproposeRegister (or re-activate) the platform webhook at the marketplace with a fresh shared secret.
channel.connect.testPOST /v1/channel/{ext}/connect-testquoteProbe the marketplace with the stored credentials (no store mutation): auth, identity header, stage allowlist.
orders.identity.revealPOST /v1/orders/{ord}/identityownerReveal the sealed buyer identity number of a marketplace order (owner session only; audited).
store.stockSettings.getGET /v1/store/stock-settingsreadStore-wide stock policy and per-channel policies (owner-only).
catalog.stockMovements.sinceGET /v1/catalog/stock-movements/sincereadStore-wide stock ledger rows after a seq watermark, ascending: the outbox read a connector consumes.
design.draft.getGET /v1/design/draftreadRead the draft bundle (rev, hash, body, preview link).
design.draft.putPUT /v1/design/draftworkspaceReplace the draft bundle under optimistic concurrency (expectedRev).
design.draft.deleteDELETE /v1/design/draftworkspaceDiscard the draft (expectedRev).
design.draftFromTemplatePOST /v1/design/draft-from-templateworkspaceInstantiate a starter template as the draft.
design.templates.listGET /v1/design/templatesreadStarter template cards.
design.versions.listGET /v1/design/versionsreadPublished version ledger (seq, hash, label, live marker).
design.version.getGET /v1/design/version/{seq}readFull body of a published version.
design.previewUrl.getGET /v1/design/preview-urlreadSigned preview link: ?hash= freezes a snapshot, ?workspace= follows that workspace's current draft (the dev-loop link).
themes.listGET /v1/themesreadInstalled themes + the first-party gallery, with presets/variables and the draft's active theme ref.
themes.getGET /v1/themes/{theme}readOne theme's manifest, variables, presets and install state.
design.catalog.getGET /v1/design/catalogreadSection catalog for the add-picker: platform sections, the active theme's sections, store composites, extension blocks.
kit.contract.getGET /v1/kit/contractreadThe Element Contract (elements, anatomy, tokens, zones, limits) the platform renders: same JSON as docs /schemas/kit-contract.json.
themes.checkPOST /v1/themes/checkquoteStatically check a SKIN theme package {manifest, css, variables?, presets?, against?}: manifest + variables schemas, the CSS grammar with the parent kit's variables, size gates, element coverage, V1 value-aware compatibility with this platform version (+ computed requires) and, with against (the previous version), the semver class the change needs. Public and side-effect-free (the CLI's mozaik theme check).
compat.contracts.getGET /v1/compat/contractsreadThe contract manifests this build was released with (storefront + api): every element/part/axis/token/section/zone/block/kit and route/command/scope a theme, skin, bundle or extension may reference. Same JSON as contracts/<kind>/<version>.json in the repo.
compat.checkPOST /v1/compat/checkquoteCheck an artifact's compatibility with this platform version without installing it: {kind: css|bundle|extension|tree, artifact, kit?, variables?} → verdict {ok, breaking[], warnings[]} with TR messages and alias fixes. Public and side-effect-free (CLI mozaik compat check, Dev MCP).
proposals.listGET /v1/proposalsreadList proposals; agent tokens see only their own.
proposals.getGET /v1/proposals/{prp}readOne proposal with its items, recorded previews and (for design items) a preview link.
proposals.applyPOST /v1/proposals/{prp}/onaylaownerApprove a proposal and apply its items in order, re-checking each recorded preview (store owner only).
proposals.resumePOST /v1/proposals/{prp}/devamownerResume a paused proposal after skipping or accepting the new preview of a stale item (store owner only).
updates.listGET /v1/updatesreadThe store's update queue (Güncellemeler): pending theme/extension/generation updates with their Geçiş raporu and preview, plus applied/blocked history, and the platform versions this store runs on.
updates.applyPOST /v1/updates/{upd}/uygulaownerPublish a prepared update (the platform's upgraded draft) to the live site (store owner only).
updates.dismissPOST /v1/updates/{upd}/erteleownerDismiss a pending update for now (it stays available; the old version keeps rendering).
workspaces.listGET /v1/workspacesreadList draft workspaces: the builder's main draft plus every agent/developer workspace with its draft rev and sandbox state.
workspaces.createPOST /v1/workspacesownerCreate a workspace; for kind agent it also mints the bound Ajan token (returned once).
workspaces.adoptPOST /v1/workspaces/{ws}/adoptworkspaceCopy a workspace draft into the builder's main draft under optimistic concurrency (never a merge).
workspaces.execPOST /v1/workspaces/{ws}/execworkspaceRun one command in the workspace's hosted sandbox (the pinned CLI is preinstalled; cwd defaults to /workspace/store). Output capped at 256 KB.
workspaces.files.listGET /v1/workspaces/{ws}/filesquoteList a directory inside the hosted sandbox (confined to /workspace).
workspaces.files.readGET /v1/workspaces/{ws}/filequoteRead a file from the hosted sandbox (≤1 MiB; base64 for binary).
workspaces.files.writePUT /v1/workspaces/{ws}/fileworkspaceWrite a file into the hosted sandbox (≤1 MiB; scratch only: store state flows through mozaik push/proposals).
workspaces.backupPOST /v1/workspaces/{ws}/backupworkspaceSnapshot the sandbox's /workspace/store to R2 (7-day TTL); restored automatically on the next cold start.
workspaces.previewGET /v1/workspaces/{ws}/preview-urlreadStable signed preview URL of this workspace's draft on the store hostname (never touches the container).
workspaces.activity.listGET /v1/workspaces/{ws}/activityreadThe workspace's append-only activity feed (exec/read/write/backup/refresh with exit codes and durations).
workspaces.refreshPOST /v1/workspaces/{ws}/refreshownerRebuild the hosted sandbox on the current platform image: backup, destroy, revoke its token; the next use recreates it fresh.
scopes.listGET /v1/scopesreadScope registry: TR labels, sensitivity and who may hold each scope (any token / developer tokens / sessions only).
tokens.mintPOST /v1/tokensownerMint an Ajan (propose-only) or Geliştirici (direct) token; the plaintext is returned exactly once.
tokens.listGET /v1/tokensownerList this store's tokens (never the secrets): kind, scopes, expiry, last use.
tokens.whoamiGET /v1/tokens/mereadDescribe the calling credential: store, kind, scopes, expiry, workspace: what an agent should call first.
audit.listGET /v1/auditreadRecent audit rows for the store (optionally by entity).
validate.bundlePOST /v1/validate/bundlequoteValidate a store bundle (schema + referential integrity) without saving anything. Media readiness is checked at draft save, which is the enforcement point.
validate.commandPOST /v1/validate/commandquoteValidate a command payload against its registered schema without running it (no preview, no mutation).
validate.manifestPOST /v1/validate/manifestquoteValidate an extension manifest against zExtensionManifest, including the agent-contract rules.

Excluded prefixes

Deliberately NOT store-management capabilities: never in the catalog, never agent tools. A /v1/… literal in the router that is neither a catalog path nor one of these fails CI (G-ROUTES).

prefixwhy
/v1/healthliveness probe
/v1/auth/merchant login/session: platform side (ADR 0015), not store management
/v1/account/apex account panel: session-only by ADR 0015; store creation is the /kur wizard
/v1/id/Mozaik ID shopper identity (ADR 0025): shopper-side
/v1/ext/{ext}/wh/provider-driven webhook ingestion (ADR 0026 §5): agents never call it
/v1/assistant/Zeki Asistan (ADR 0028): the assistant IS an agent surface; owner-session product endpoints, never agent tools
/v1/psp/legacy iyzico webhook alias: pending the user's dashboard re-registration
/v1/cargo/geliver/webhooklegacy Geliver webhook alias: pending deletion with the above
/v1/ops/V1 operator surfaces (fleet-gate runs, schema preflight): OPS_KEY-gated, CI/founder only, never a store capability
checkout.internalstorefront→api service-binding enclave (ADR 0021)
Generated from the live platform registries at build time: reference pages cannot go stale. Markdown variant: /reference/routes.md