Publishes product.route.*; null publishes nothing (scripts, tests).
Protected ReadonlycacheProtected ReadonlydbStaticinstanceThe process default: built from each dependency's own instance().
ProtectedbustAfter a committed write: the folded-get keys (a tag bust no-ops without
Valkey), then every page through the collection tag.
ProtectedcachedServes input's page from the cache, else runs query and caches it.
OptionalbankAccountId?: string | nullThe account the route moves money through (register external_id).
Its program is derived from it.
Optionaldata?: ProductRouteVersionDataPer-route operational knobs (timezone, quote TTL, ...). Persisted
to product_route_version.data. Defaults to {} when omitted.
cutoffTimezone must be an IANA Area/Location name — see
invalidCutoffTimezone.
OptionaleffectiveFrom?: InstantWhen this version becomes effective. Defaults to now() at the DB
layer when omitted. Pass a future Temporal.Instant to schedule a
route change.
OptionalfeeVisible?: boolean | nullOptionalfixedFeeAmount?: BigNumber | nullVendor fee for THIS route (CFX-to-vendor cost). Persisted on the version row; omitted fields default to null (no fee).
Optionallabel?: string | nullOptionallimit24hMaxCount?: BigNumber | nullOptionallimit24hMaxUsd?: BigNumber | nullOptionallimit30dMaxCount?: BigNumber | nullOptionallimit30dMaxUsd?: BigNumber | nullOptionallimit7dMaxCount?: BigNumber | nullOptionallimit7dMaxUsd?: BigNumber | nullOptionallimitTransactionMaxUsd?: BigNumber | nullOptionallimitTransactionMinUsd?: BigNumber | nullVendor limit ceilings for THIS route. Persisted on the version row; omitted fields default to null (no ceiling).
Optionalmatcher?: MatcherOptionalprogramId?: string | nullThe program of a sub-account provider's route (prog_…). A vendor
with a live program needs this or an account.
OptionalvariableFeeBps?: BigNumber | nullSoft-delete a route. Rules attached to the route persist until removed.
Read the full append-only version history for a route, newest first.
Returns null when the route doesn't exist (or is soft-deleted).
Clear each customer's membership tag and each record tag wherever cached,
and always this namespace's collection tag. keys are exact deletes in this
instance's key space: the only bust a null client honours.
OptionalbankIds?: string[]OptionalcreatedAt?: DbTimestampCriteria<Instant>Optionalids?: string[]OptionalorderBy?: DbOrderByCriterion<Optionalpage?: numberOptionalpageSize?: numberOptionalproductIds?: string[]Optionalq?: stringFree-text match over the route external id, product name, vendor name,
and route label — the selector search box (searchRoutes) feeds this.
OptionalupdatedAt?: DbTimestampCriteria<Instant>Optionalvendors?: Vendor[]ProtectedsearchTags for a page: the scope its query searched (each customer's membership
tag, else the collection tag), so an empty page is bustable too, plus the
records it projects and the fields that chose or ordered its rows.
Update a route. priority and status edits update the identity row in
place; matcher/vendor/label/fee edits insert a new version and flip the
pointer. Both can happen in the same transaction. productId is part
of identity and not editable. Untouched fee fields carry forward from
the previous version. Per-vendor limit ceilings aren't editable here —
those live on product_vendor (use the vendor admin service).
Admin-tier CRUD over
product_route.Identity / version split:
product_routeis the lifecycle row (status, priority, deletedAt).product_route_versioncarries the routing decision — which vendor + which matcher — plus the vendor's per-route terms (fee + limit ceilings). The vendor row carries identity only.Soft-delete is the terminal signal.