Licensing
Every Amnetic listing is sold under a license — the terms that say what a buyer
may do with the data. By default a listing sells under its standard terms (the
frozen platform defaults) at the listing's price_cents. Sellers can also publish
additional priced licensing tiers — an offer ladder — so a buyer can pay more
for broader rights (commercial use, model training, redistribution within their
org) or less for a narrower grant.
Availability. The priced-offer surface is gated behind
LICENSE_TERMS_ENABLEDand is pending counsel review — not yet GA. Where the flag is off, the licensing MCP tools and the.../license-offersREST routes are simply absent (404-by-absence) and every listing sells under its standard terms.
The Data Standard License (DLS)
The platform's current default composition is a provisional quote-integrity
input, not a settled interpretation of model training or any other operative
right under ToS §5.3. That interpretation remains pending counsel review.
DLS-1 is the draft instrument version used by the dark composed-offer work; it
is not yet a GA claim that the standard tier is governed by a ratified DLS. Until
quote and settlement transition together after counsel approval, standard quote
evidence remains pinned to the pre-ratification tos/5.3-draft instrument. A
composed offer records its instrument version when it is composed, so a later
grant's meaning is fixed at purchase time and cannot be rewritten under a buyer's
feet.
The rights themselves are expressed as a terms composition over a small, frozen
vocabulary (schema lts/1): a set of named dimensions, each taking one option
from a closed list. There are no free-form terms — this is what lets the market
compare, price, and reason about grants, and what keeps the agent-facing surface an
enum, not an injection vector.
The terms dimensions
An offer's terms is a { dimension: option } map. You supply only the dimensions
you want to change; every omitted dimension takes its platform default, and the
stored composition is always fully materialized (every dimension explicit).
| Dimension | Options (narrow → broad) | Default | Meaning |
|---|---|---|---|
use |
non_commercial | commercial |
commercial |
Whether the data may be used commercially. |
redistribution_scope |
individual | entity | entity_affiliates |
entity |
How widely, within the buyer's own organization, the data may be shared. External redistribution is never an option. |
derived_display |
none | public |
none |
Whether derived features/analytics may be displayed publicly. |
training |
none | internal |
none |
Whether the data may be used to train models (internal to the buyer). |
training_serve |
none | allowed |
none |
Whether a model trained on the data may be offered as a service. Requires training: internal. |
training_weights |
none | allowed |
none |
Whether trained model weights may be distributed. Requires training: internal. |
term |
perpetual | 12 | 24 | 36 |
perpetual |
Use term in months (a closed set — no arbitrary integers). |
attribution |
required | not_required |
not_required |
Whether the buyer must attribute the source. |
exclusivity |
none | exclusive |
none |
Reserved. Exclusive grants are not sold in v1 — composing exclusive is refused. |
training_serve and training_weights are peers, not a ladder — each is a
separate election on top of training: internal, and composing either without
training: internal is a hard error. A composition that exactly equals the
platform defaults is refused as an offer (the standard terms are already offered
virtually — see below), so every priced tier is a genuine departure from default.
Offer keys
Each tier carries a seller-chosen offer_key — a short, stable slug matching
^[a-z0-9][a-z0-9_-]{0,31}$ (e.g. internal_training, wide_commercial). It is
the human-facing name of the tier and is stable across re-pricing. standard and
default are reserved — they name the listing's virtual default tier, which is
never a materialized offer row — so you cannot use them as an offer_key.
There is a configurable per-listing cap on the number of live composed offers
(MAX_LICENSE_OFFERS_PER_LISTING, default 8, valid range 1–64), and within a listing every
live offer must have a distinct offer_key and a distinct terms composition —
the live offer set is a function, not a bag.
Stored prices for both the standard listing tier and composed tiers must be nonnegative 32-bit integers. Composed tiers always pin an embedded DLS version; the pre-ratification Terms of Service discriminator is reserved for the virtual standard tier and cannot appear on a composed offer. Deployments also audit that no existing listing exceeds 64 active composed offers before enabling these backstops; if one does, migration stops and reports the listing and count for explicit operator reconciliation rather than retiring offers automatically.
Accept the licensing terms first (server-stamped)
Composing offers publishes legal instruments that bind you, so before your first compose your account must accept the current licensing Terms of Service. This acceptance is server-stamped: the server records the version in force at the moment you accept — a client can never supply or assert a version. This is what makes the acceptance real consent evidence rather than a value any tool could mint.
You record acceptance in the same call that composes your first offer set, by
passing accept_licensing_terms: true (on set_license_offers, the inline
create-block, or the portal). It is idempotent — a no-op once your account has
accepted. If you compose without having accepted, the call is refused:
{ "error": "licensing terms acceptance required",
"code": "licensing_terms_acceptance_required",
"required_version": "tos/5.3-draft",
"instrument_url": "https://amnetic.ai/terms" }
Retire-all (composing an empty offer set) needs no acceptance.
Composing offers
There are three ways to compose a listing's offer ladder, all routed through the one server-side compose chokepoint (same validation, same server-stamped gate):
- MCP —
set_license_offersreplaces the full live offer set (replace-set semantics);get_license_offersreads it back. See the MCP tools reference. - Inline at create time — the
create_listingMCP tool and the RESTPOST /api/v1/seller/documents//files//datasetscreate paths accept an optionallicense_offersblock, so a listing is born with its ladder in one call. See Selling data and the API reference. - Portal — the seller portal's listing editor (where enabled).
Composing is replace-set, not a patch: you send the full desired live set. Unchanged entries keep their ids and versions, a repriced or recomposed entry gets a new versioned row, dropped entries are retired, and an empty list retires all.
A composed offer reads back with its offer_id, offer_key, terms,
terms_schema_version (lts/1), dls_version (DLS-1), price_cents,
currency, status, and a settlement token — plus any non-fatal coherence
warnings (for example, a strictly broader tier priced at or below a narrower one).
Warnings never block a compose; they surface pricing that a buyer would find
incoherent.
Discovering public offers
Every public listing includes license.standard.token, even while priced offers
are disabled. That is the binding dv1: quote token the buyer can echo as
expect_token for a standard purchase; it changes if the standard price or
governing instrument changes.
When LICENSE_TERMS_ENABLED is on, public listing reads also include the fully
materialized provisional standard composition (terms) and price_cents, the
lts/1 schema version, and the live composed offers with their ids, keys,
terms, prices, currencies, and tokens. offers is [] when none are live. When
the flag is off those additive fields are absent and only the standard token
remains. This is a dark, pre-ratification surface pending counsel review, not a
representation that the displayed default composition settles training rights or that
priced offers or DLS-1 are generally available.
The same enabled projection is attached to each enter_market
recommended_listings[] entry after the forgetful agent returns its bounded
listing-id verdict. This gives the outer buyer agent the offer_id and token
to echo into a later explicit purchase without allowing the inner agent to
author license data. This is provisional pre-purchase quote metadata, not the
operative license text, a grant, a debit, or acceptance. A separate dark phase
adds the exact pre-purchase text path described below; do not purchase from the
enum metadata alone without reading that operative text.
Buyers may also pass a non-empty, closed-enum required_rights object with
minimums for any of the eight requestable dimensions (all dimensions above
except exclusivity). For each recommendation, the platform compares those
minimums against the already-visible ladder and attaches
rights_fit.band (fit, partial, no_fit, or unknown). Only fit carries
best_offer: composed fields are copied from the selected visible ladder entry,
while standard normalizes its terms/price/token with listing currency and a null
id. Cheapest fit is deterministic by price, then standard before composed, then
composed offer id. This is mechanical fit computation, not legal
advice, permission, warranty, operative text, acceptance, or a grant.
Without a non-empty requirement, recommended_total_cents remains the sum of
standard listing prices and preserves its historical omitted-all-zero wire.
With requirements active, it instead sums current best_offer prices; non-fit
rows contribute zero and an all-zero total is emitted explicitly. The number is
advisory only—no funds or rights are reserved. This surface is available only in
non-production flag-on environments and remains absent in production pending
counsel ratification.
For an open public listing, read the exact operative text before buying with
GET /api/v1/listings/{listingId}/license-text/{offerKey}. Use standard for
the virtual tier or an active composed key advertised in license.offers. The
response repeats the resolved terms, schema and instrument versions, hashes,
price, currency, and settlement token beside the hash-verified stored text;
composed offers also include their immutable offer_id. Responses are never
cacheable (Cache-Control: no-store) because a seller may retire and re-compose
the same key—bind your decision to token. The route is absent while licensing
is off, and hidden listings or unavailable keys return opaque 404s.
This is availability evidence, not a legal conclusion. Counsel still needs to confirm that assembled machine-readable terms and purchase-as-acceptance are sufficient, and whether eligible buyers of restricted listings require a separate authenticated pre-purchase text path before GA.
In-wall offer discovery
The forgetful buyer agent sees the full quotable ladder when it examines a
listing. get_listing adds a non-empty top-level license_offers array without
changing its listing_id input. The virtual standard tier is always first and
uses offer_id: null; active composed tiers follow in stable order. The array
contains at most 65 entries (one standard plus the shared ceiling of 64 composed):
{
"license_offers": [
{
"offer_id": null,
"offer_key": "standard",
"terms": { "use": "commercial", "redistribution_scope": "entity", "derived_display": "none", "training": "none", "training_serve": "none", "training_weights": "none", "term": "perpetual", "exclusivity": "none", "attribution": "not_required" },
"price_cents": 4500,
"currency": "usd",
"token": "dv1:…"
}
]
}
This buyer-safe projection deliberately omits schema/DLS versions, row status,
and evidence documents. Terms are the closed lts/1 vocabulary above, not seller
prose. Hidden, inactive, self-owned, or ACL-ineligible listings remain opaque.
The inner agent still returns only listing ids; the outer recommendation ladder
is a separate platform-side read of current public/authorized offer metadata, so
seller content and inner-agent prose never gain a new egress channel.
Buying a composed tier
A buyer selects a tier at purchase time. The purchase
tool accepts offer-aware items instead of bare listing ids:
{ "items": [ { "listing_id": "…", "offer_id": "…", "expect_token": "…" } ] }
REST POST /api/v1/purchases accepts the same selectors as top-level fields
beside listing_id. Both REST and MCP also support funding_mode card modes for
a single listing; card mode returns a hosted Stripe checkout URL and grants the
license only after webhook settlement.
offer_idselects a composed tier; omit it to buy the listing's standard terms.expect_tokenoptionally asserts the exact quote you saw — if the offer changed since, the item is refused (price_changed) rather than charged at a new price.renew_of_grant_idrenews an existing grant on the same terms.
Each completed purchase returns its offer_id, offer_key, terms_hash, and a
grant_id (the evidence record of the license you now hold), and an outcome of
purchased or already_licensed (buying a tier you already hold is reported, not
double-charged). Offer-level refusals return a structured error_code
(offer_unavailable, price_changed, or renewal_invalid) with the listing id
and detail; offer_unavailable includes the current live offers so the buyer can
re-select.
For a rights-fit recommendation, echo both
rights_fit.best_offer.offer_id (omit/null for the standard tier) and
rights_fit.best_offer.token as expect_token. Settlement re-resolves the
selector and token; the quote is stale-assertion metadata, and only the minted
grant is license evidence. On the asynchronous card rail, post-payment drift can
produce funded_only: the money remains spendable, nonwithdrawable wallet credit
and no license grant is minted.
Next
- MCP tools reference —
set_license_offers,get_license_offers, and thepurchaseitems surface. - Selling data — composing tiers as a seller, including the inline-on-create shortcut.
- API reference — the REST
.../license-offerssub-resource and the inline create block.