Skip to content

Spec Proposal: Discovery-Time Access & Monetization Signaling #83

Description

@MartinRistov

Following up on this #20 monetization signaling in ARD entries with a fleshed-out design so we have something concrete to react to. Scoped to access/monetization only — auth-feasibility signaling is kept out (see "Out of scope" below), per @zeroasterisk & @darrelmiller's point that auth hints at the discovery layer are a separate discussion.

Design principle: ARD signals, it doesn't transact

accessModel communicates a coarse access signal; registries and clients judge and act — same shape as the trust model, consistent with §3.6 Separation of Concerns. Authoritative commercial terms live behind pricingUrl / in the resource's native card. Any structured price echoed into the entry is an optional, non-authoritative cache for filtering — ARD does not become a billing spec. §4.5 Description Vocabulary already names pricing as a legitimate filter dimension; this just gives it a small, named, interoperable shape.

Proposed field (optional, on the Catalog Entry §4.2)

Only tier is required when the object is present; everything else is optional (a publisher can say as little as {"tier": "free"}).

"accessModel": {
  "tier": "paid",
  "paymentProtocol": "x402",
  "pricingUrl": "https://acme.com/pricing",
  "price": { "amount": 0.01, "currency": "USD", "unit": "per_call" },
  "freeTier": { "unit": "per_month", "quantity": 100 },
  "mediation": { "marketplace": "example-marketplace", "productRef": "prod-xxxxx" }
}
Field Req. Description
tier yes* free | freemium | subscription | paid | negotiated. Primary filterable/rankable signal.
paymentProtocol no Self-serve payment mechanism, e.g. x402, marketplace.
pricingUrl no Authoritative terms (source of truth).
price no Non-authoritative echo for filtering: { amount, currency, unit }.
price.unit no per_call | per_token | per_seat | per_month | flat.
freeTier no Included allowance, e.g. { unit, quantity }.
mediation no Vendor-neutral pointer that the resource is transactable via a marketplace; marketplace + opaque productRef (ARD does not interpret them).

* required only when the object is present; the object is optional on the entry.

tier: negotiated deliberately separates self-serve-payable from needs-a-deal (price not public / private offer). price.unit, negotiated, and mediation are intentionally abstract so any marketplace or SaaS vendor can instantiate them without their model being baked into the spec.

How a client uses it

Filter (prefer free/freemium; exclude negotiated for an autonomous run that can't complete a sales motion) or rank (bias toward affordable/covered) before selection — avoiding the select-then-402 dead end. Suggest adding an optional accessTier to the Appendix A structured filters.

Why entry (not card)

The coarse gate must be filterable without fetching the artifact, so it belongs in the entry the registry indexes. The optional richer terms stay in the same object (framed as a non-authoritative echo of pricingUrl/the native card) to avoid a second lookup. This matches the pattern in ai-catalog issue #63 and ai-catalog issue #65 — optional structured objects on the entry, justified by a discovery-time decision.

Out of scope

  • Auth-feasibility (authHint) — supported auth schemes / DCR / on-behalf-of at discovery time. Separate concern; worth its own issue. (Note Spec Proposal: Dependencies manifest #63 already carries identityType: "OBO" on dependencies — an existing discovery-time auth-feasibility signal.)
  • Entitlement / "covered" state — whether this buyer is already covered is buyer-specific and runtime-resolved, which fights the static-manifest model. Deferred as the runtime complement to this discovery-time signal.

Open questions

  1. Is 5 the right granularity for tier? Is negotiated distinct enough to keep?
  2. Keep price/freeTier in the entry (as non-authoritative echo), or stop at tier+paymentProtocol+pricingUrl and defer structured terms to the card?
  3. Add accessTier to Appendix A filters?
  4. Naming: accessModel vs. access vs. commercialTerms?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions