{"service":"vizen-core-api","llms_txt":"/llms.txt","openapi":"/openapi.json","partner_openapi":"/partner/openapi.json","docs":"/docs","docs_index":"/docs/index.json","quickstart":"/docs/quickstart","webcoding_guide":"/docs/webcoding","catalog_import_guide":"/docs/catalog-import","promotions_reference":"/docs/promotions.json","vz_keys_guide":"/docs/vz-keys","widgets_reference":"/docs/widgets","vz_keys_reference":"/docs/vz-keys.json","scopes_reference":"/docs/scopes.json","events_reference":"/docs/events.json","validate":"/docs/validate","skills":"/docs/skills","areas":[{"path":"/docs/catalogue","read_when":"before reading or filling a shop's goods: a filter written without the `filter.` prefix is swallowed and returns the WHOLE catalogue with a 200 — compare `total` before and after","status":"current","scopes":["catalog:read","catalog:write","storage:read","storage:write"]},{"path":"/docs/file-storage","read_when":"before using Studio folders or uploading a multi-page static site: storage UUID collections, site-folder release paths and feed templates are different APIs; inspect scopes, per-file limits and URL routing","status":"current","scopes":["storage:read","storage:write","catalog:read","catalog:write","site-folders:read","site-folders:write"]},{"path":"/docs/transfer","read_when":"draft: you already HAVE a site, template or export — move it 1:1, do not rebuild it: a folder is a level-3 widget in real page DOM (scripts run, position:fixed works), header/footer are chrome groups, site-wide CSS is the layout folder, shop data is re-bound with vz- keys","status":"draft","scopes":["catalog:read","catalog:write","storage:write"]},{"path":"/docs/widgets-area","read_when":"the fast path: platform blocks with live data, a look as wide as their props. Props are nested (`props.listing.…`); writing to the root of `props` is accepted and does nothing","status":"current","scopes":["catalog:read","catalog:write"]},{"path":"/docs/own-markup","read_when":"the bespoke path: your own HTML/CSS/JS over live shop data — vz- keys, what the block wrapper does to your layout, images through the resizer","status":"current","scopes":["catalog:read","catalog:write","storage:write"]},{"path":"/docs/components","read_when":"the SAME markup on many pages with different content: a folder with `component.json` beside `index.html` and `{{key}}` in the markup — the owner fills the values, a new release updates every insertion at once. One page, one piece of code — stay on own-markup","status":"draft","scopes":["catalog:read","catalog:write","storage:write"]},{"path":"/docs/chrome","read_when":"header, menu, footer and the page skeleton: a GROUP lists blocks and a slot binds it, groups take ANY block including your own markup — that is how a custom header is made; a slot bound to 0 means \"nothing here\"","status":"current","scopes":["catalog:read","catalog:write","storage:write"]},{"path":"/docs/news","read_when":"editorial pages — rubrics, dated materials and their feeds: a rubric is a category with `type: \"news\"` and is created UNPUBLISHED (404 until published); the cover and title of a material are drawn by the template's `articleHeader` widget, so a heading in the body is a second H1; `sidebar_config` is accepted and does nothing","status":"current","scopes":["catalog:read","catalog:write"]},{"path":"/docs/pricing","read_when":"before adding wholesale or quantity prices: a pricing rule fixes the unit price and hard-locks promotions; it is not a discount, cost field or staff role","status":"current","scopes":["pricing:read","pricing:write"]},{"path":"/docs/promotions","read_when":"before printing any price next to a discount: the price a shopper sees is COMPUTED from rules, not stored, so a client that recomputes it disagrees with the cart on the first product two rules touch","status":"current","scopes":["promotions:read","promotions:write"]},{"path":"/docs/orders","read_when":"draft: an order is a SNAPSHOT — nothing recomputes its money after checkout, and editing a promotion afterwards changes no existing order. Four statuses, freely in both directions","status":"draft","scopes":["orders:read","orders:write","checkout:read","checkout:write"]},{"path":"/docs/webhooks","read_when":"before building a receiver: a signed POST per event, at least once and unordered — dedupe by `event_id`, answer 2xx within 10 s, and never treat the event as the source of truth","status":"current","scopes":[]},{"path":"/docs/stock","read_when":"draft: stock is a NUMBER plus a LEDGER. `NULL` means \"not tracked\" (a service, a made-to-order item), not \"zero\" — otherwise a seller who never set stock reads as sold out","status":"draft","scopes":[]},{"path":"/docs/tasks","read_when":"the shop's own work — task boards and cards (`tasks:*`, not leads): 64-bit ids are JSON strings, `extra` is base64 of a whitelisted object, `column_id: 0` is the intake, board and column endpoints take the right of the board's kind, assignee ids come from `GET /v1/orgs/{company_id}/members`, and a misspelled `GET /tasks` filter returns every task","status":"current","scopes":["tasks:read","tasks:write"]},{"path":"/docs/feeds","read_when":"files on the storefront host under `site-files:*` — at the root or under any category (`category_id` + `name`, the full `path` is computed): Yandex YML and Google Merchant feeds, CSV, ads.txt, verification files, simple .html pages (scripts never run: CSP sandbox; interactive pages are HTML widgets): a Go template rendered on the live catalogue at listing prices with values escaped per format; saving checks syntax only, `POST /site-files/preview` catches the rest; `/products/{id}/ad-participation` keeps a product out of every feed","status":"draft","scopes":["site-files:read","site-files:write"]},{"path":"/docs/redirects","read_when":"before moving, renaming or deleting a category, product or article, or when old addresses must keep their traffic (`redirects:*`): exact rules, masks (`*`, `**`, `$1`), prefixes, `query_match`, the nearest-section fallback, the CSV exchange, the 404 log of missed addresses; before `POST /categories/move` call it with `dry_run: true` and ask the user whether to pin the old addresses with `pin_rules`","status":"draft","scopes":["redirects:read","redirects:write"]},{"path":"/docs/resource-access","read_when":"before building anything for a shop that is still under construction: a site can be UNPUBLISHED — closed behind a short numeric PIN, `Disallow: /` for crawlers, three wrong PINs locking an address out for 10 minutes. The PIN is readable in plain text by the owner. The per-resource password matrix below it is still staged","status":"draft","scopes":["access:read","access:write"]},{"path":"/docs/troubleshooting","read_when":"open when the API answered 200 and the site did not change: the order of diagnosis, the table of silent refusals, and the acceptance checklist for any storefront change","status":"current","scopes":[]}],"token_introspect":"/v1/account/token","sections":{"catalog":"/products","categories":"/categories","storage":"/v1/storages/files","account":"/v1/account/profile","org":"/v1/orgs/current"},"note":"catalog is unprefixed (/products); storage/account/org live under /v1"}