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.
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).
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).
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).
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/psp/legacy iyzico webhook alias — pending the user's dashboard re-registration
/v1/cargo/geliver/webhooklegacy Geliver webhook alias — pending deletion with the above
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