Product tariff publish and history API
The Vendor Console Management API exposes immutable version history for one Product tariff series and an explicit Draft publication action. These routes are not part of the public Partner API subset.
Operations
| Method and path | Permissions | Result |
|---|---|---|
GET /api/v1/catalog/products/{productId}/tariffs/{vendorOfferId}/versions?offset=0&limit=50 | catalog.read + commerce.read | Ordered immutable version history |
POST /api/v1/catalog/products/{productId}/tariffs/{vendorOfferId}/versions/{offerVersionId}/publish | catalog.read + commerce.read + commerce.manage + policies.read | Publishes the exact eligible Draft |
History contains safe commercial fields, lifecycle timestamps, a current Policy display label and an explicit technical-package resolution status. It never returns Tenant ids, PriceBook ids, provider price ids, canonical package references, hashes or internal codes.
Readers without both optional commerce.manage and policies.read permissions
receive publishAction: null. With both permissions, every row reports a safe
publishAction.blockingReason; only the single eligible Draft can report
Ready and allowed: true. An unavailable historical Policy remains visible
with no label and TechnicalPackageUnresolved completeness.
Console journey
In Product → Tariffs, the tariff name opens its immutable version history. The localized table shows version/lifecycle, price, current Policy label, effective window, completeness and publication readiness without rendering raw owner ids, package references or hashes. Read-only history has no publish control; blocked rows display the server reason without becoming actionable.
Only a Ready Draft opens confirmation with safe repeated evidence. One
confirmation creates one immutable attempt. Dependency retry preserves the
exact path, body and idempotency key; stale data closes confirmation, reloads
history and requires a new confirmation. Success and exact replay both reload
history and the Product tariff aggregate.
Publication rules
POST accepts exactly { "expectedRevision": positive-safe-integer }, one
printable ASCII Idempotency-Key of 1–128 characters, and JSON content type.
Unknown, duplicate or authority-bearing members are rejected before owner
calls. Tenant comes from the authenticated context; Product, tariff and version
come only from the canonical path.
A durable exact replay is resolved before mutable Product and Policy checks.
For a new attempt the service validates an Active Product, fresh VCM history,
the exact Draft revision and its pinned exportable Policy package before VCM
commits publication. Success and replay both return a safe Published receipt;
replay has isIdempotentReplay: true.
Safe failures
The routes use stable commerce.tariff_* errors: invalid request (400),
source not found (404), invalid state, stale data, idempotency conflict or
invalid source evidence (409), and dependency unavailable (503). Required
owner failure returns no partial history.
Authoritative wire schemas are in the committed Management OpenAPI document; the full Management artifact is not published as a public Partner download.