x402-demand (listing-only)

Will anyone pay for this x402 endpoint? Give it an x402 listing — resource URL, description, price, network — and it returns a calibrated probability that the endpoint receives at least one paid call in the next 7 days (and 14 days), in one forward pass.

It is a fine-tune of convaiinnovations/laya (ModernBERT-large + decision head, 421M), trained on 31 days of daily snapshots of the Coinbase CDP x402 discovery index (the "Bazaar"). It loads with laya.load() and needs no listing history, so it works on a brand-new listing — or on one you have not published yet.

Demo: https://sentedge.ai/x402-demand/ (free) · Hosted telemetry scoring: $0.01 per call over x402 (see below)

Why this exists

Only about a quarter of listed x402 services get paid even once in a given week, and 59% of the listings present on 2026-08-24 were gone 30 days later. An agent choosing which endpoint to pay, or a builder deciding what to list, is working against that base rate.

Use

pip install laya torch
import json, laya

agent = laya.load("Priceman614/x402-demand")          # CPU is fine
QUESTIONS = {  # use this exact wording - it is what the checkpoint was trained on
    "paid_7d":  {"type": "noul", "instructions": "Will this x402 pay-per-call API receive at least one paid call in the next 7 days?"},
    "paid_14d": {"type": "noul", "instructions": "Will this x402 pay-per-call API receive at least one paid call in the next 14 days?"},
}
state = {
    "resource": "https://api.example.dev/v1/forecast",
    "description": "Hourly 7-day weather forecast for any lat/lon, JSON.",
    "price_usd": "0.001",                 # USD per call, as a string
    "network": "eip155:8453",             # as it appears in the listing
}
out = agent.predict(json.dumps(state), QUESTIONS)["answers"]
print(out["paid_7d"]["noul"], out["paid_14d"]["noul"])

The state keys and their order matter: resource, description, price_usd, network, serialised as JSON. Pass only the first 200 characters of the description. The training snapshots stored descriptions cut to 200 characters, so the model has never seen more.

Results

Held-out test: later dates × hosts never seen in training (13,644 listing-days across 442 unseen hosts; details under Training below). ROC AUC for paid within 7 days:

Model All test hosts New listings Hosts with ≤ 20 listings
Recency rule (days since last paid call) 0.635 0.416 0.696
Logistic regression, telemetry 0.678 0.500 0.731
LightGBM, telemetry 0.672 0.514 0.737
x402-demand · listing only (this model) 0.639 0.575 0.668
x402-demand · listing + telemetry (not released) 0.732 0.581 0.754

AUC by segment

How to read this honestly:

  • On its own, this model is weaker than models that see a listing's call history. It only reads the listing text, so it cannot see that a service was paid yesterday.
  • It is the only model above chance on brand-new listings (AUC 0.575 vs 0.50-0.51), where telemetry does not exist yet.
  • Its score adds to a telemetry model. A LightGBM given this score as one more feature gains +0.027 AUC overall (95% CI −0.008 to +0.073, host-resampled bootstrap) and +0.08 on new listings (95% CI −0.002 to +0.153). The gain is consistent but not conclusive with 442 test hosts.
  • The listing + telemetry variant beats the LightGBM baseline by +0.058 AUC (95% CI +0.010 to +0.110). It is not released as weights; see Hosted scoring.

Calibration

Calibration. The checkpoint ships one fitted temperature (applied automatically by laya.Agent). On the test set its expected calibration error is 0.116. It is over-confident above ~0.5: treat 0.7 as "roughly 45%". If you need decision-grade probabilities, refit calibration on your own traffic.

Lift by decile

Full numbers, including paid_14d, Brier, ECE and segment breakdowns: results/metrics.json.

Training

  • Label: paid_Hd = 1 if the listing's quality.lastCalledAt advances within H days of the snapshot, i.e. it received at least one paid call. It is not "still listed". The index evicts a listing exactly 30 days after its last paid call, so survival is mostly arithmetic on a known timestamp; paid demand is the real signal.
  • Data: 31 daily snapshots (2026-08-24 → 2026-09-23), ~15k listings per day, 23.9k distinct resources, 2,464 hosts. The dataset is not released.
  • Splits: a host wall (sha256 buckets; 20% of hosts reserved for test) and a time wall (training label windows end before the first test day). A further 10% of hosts is held out from training for model selection and temperature fitting.
  • Target: the text is identical across a listing's snapshots, so each listing is one example whose soft target is the share of its training days that were paid.
  • Recipe: a single-GPU port of Laya's upstream RLCD fine-tuning. REINFORCE on a strictly proper scoring rule (log + spherical) with a group baseline, plus soft cross-entropy. 3 epochs, best by held-out-host AUC, bf16, one DGX Spark GB10. Full procedure: docs/PROCESS.md.

Limitations

  • 31 days of history. One month, one clean 14-day window. The x402 market is weeks old and moving fast; expect drift. Retrained monthly.
  • Paid ≠ legitimate. A keep-alive self-call or scripted traffic counts as a paid call. This predicts demand, not quality or honesty.
  • One index. Trained on the CDP Bazaar only.
  • Over-confident at the top (see calibration). Do not use the raw probability as a hard gate without recalibrating.
  • Mass-listing hosts. Some hosts publish hundreds of near-identical endpoints. The test excludes their training hosts, but the model has learned what such listings look like.

Hosted scoring (live)

The listing + telemetry variant (AUC 0.73; isotonic-recalibrated, test ECE 0.079) runs against today's Bazaar catalog as a pay-per-call x402 endpoint. It costs $0.01 in USDC on Base:

POST https://sentedge.ai/api/x402-demand/score
{"resource": "<a resource URL listed in the CDP x402 Bazaar>"}
-> 402 Payment Required -> pay -> {"paid_7d": 0.62, "listing": {...live telemetry, days until eviction...}}

Resources that aren't in the current catalog are refused before payment, and a failed score is never settled. Spec: https://sentedge.ai/api/x402-demand. There's also a free demo of this listing-only model: https://sentedge.ai/x402-demand/

Citation

@misc{x402demand2026,
  title  = {x402-demand: calibrated paid-demand prediction for x402 endpoints},
  author = {Price, Ryan},
  year   = {2026},
  note   = {Fine-tuned from convaiinnovations/laya on CDP Bazaar snapshots}
}

Base model © Convai Innovations, Apache-2.0.

Downloads last month

-

Downloads are not tracked for this model. How to track
Safetensors
Model size
0.4B params
Tensor type
F16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Priceman614/x402-demand

Finetuned
(52)
this model