Docs

Vary tells agents, in a machine-readable feed, when the services they depend on change their prices, quotas, features, API versions or retirement dates. No signup. The free endpoints are open. A Pass unlocks the full history.

Discovery

Machine-readable descriptions live at three addresses.

GET https://vary.nanocorp.app/openapi.json - the OpenAPI spec
GET https://vary.nanocorp.app/.well-known/vary.json - the discovery file
MCP endpoint: POST https://vary.nanocorp.app/mcp - JSON-RPC, tools: get_status, get_catalog,
  get_sample, get_pricing, list_changes, get_event, get_proof

Free endpoints

No key, no payment. The sample is real data, never fabricated.

# Freshness first: check frequency and last successful check per source
curl https://vary.nanocorp.app/v1/status

# What is monitored
curl https://vary.nanocorp.app/v1/catalog

# A small set of real events, with full fields and proof
curl https://vary.nanocorp.app/v1/sample

# The one offer and its real availability status
curl https://vary.nanocorp.app/v1/pricing

Buy a Pass

One offer: 9 USDC for 30 days, 1,000 requests, history up to 90 days. Payment is x402, USDC on Base Sepolia while the cycle is in testnet proof. The purchase path opens in production once the production x402 path exists; its status is always stated in /v1/pricing.

# 1. Call a paid endpoint without a key: 402 with the x402 requirements
curl https://vary.nanocorp.app/v1/changes

# 2. Pay with any x402 client, then retry the purchase endpoint with the
#    payment header and an idempotency key
curl -X POST https://vary.nanocorp.app/v1/passes \
  -H "X-PAYMENT: <base64 x402 payment>" \
  -H "Idempotency-Key: <your key>"

# 3. The 201 shows the api_key once, with expiry and quota
{
  "pass_id": "pass_...",
  "api_key": "vary_...",
  "expires_at": "2026-11-08T15:08:47Z",
  "quota_remaining": 1000,
  "status": "active"
}

The same Idempotency-Key returns the original 201 and never charges twice. A used payment under a different key is refused. A renewal bought while a pass is active queues behind it and starts when it expires or its quota runs out.

Read the feed

# Events since your last read, filtered as needed
curl -H "Authorization: Bearer vary_..." \
  "https://vary.nanocorp.app/v1/changes?provider=example_provider&type=price_change&cursor=<next_cursor>"

# One event, all fields
curl -H "Authorization: Bearer vary_..." https://vary.nanocorp.app/v1/events/<id>

# The proof behind an event: excerpt, locator, snapshot date
curl -H "Authorization: Bearer vary_..." https://vary.nanocorp.app/v1/events/<id>/proof

# Check your passes, quota and expiry
curl -H "Authorization: Bearer vary_..." https://vary.nanocorp.app/v1/pass

Every paid response carries x-quota-remaining and x-expires-at headers. A failed call never consumes quota. An empty list carries last_successful_check, so an empty answer is never stale data presented as fresh.

Event schema

idstring - stable event id, e.g. evt_20261009_a1b2
providerstring - provider slug, e.g. openai
servicestring - service slug, e.g. model_api
typestring - one of the six event types
fieldstring - what changed, e.g. input_price
old_valuestring or null - unknown stays null
new_valuestring or null - unknown stays null
contextstring or null - region, tier or conditions
official_urlstring - the source URL the check watched
published_atstring or null - provider publication date, UTC
detected_atstring - when the daily check found it, UTC
effective_atstring or null - known effective date, UTC
verification_statusstring - verified, unverified, ambiguous or corrected
corrects_event_idstring or null - set when this event corrects another

Event types

price_changeA price moved. Old and new value keep currency and unit.
quota_changeA limit or allowance moved: requests, tokens or rate.
new_featureSomething was added to the service.
breaking_changeAn interface or behaviour broke for existing callers.
deprecation_announcedA retirement was announced, with its date when known.
retirement_confirmedThe retirement is confirmed and dated.

Errors

Every error is JSON with code, message and docs_url.

payment_required402 - a Pass is required. The body carries the x402 requirements.
payment_invalid402 - the facilitator refused the payment. Nothing was charged again.
payment_unavailable503 - the purchase path is down. Free endpoints stay open.
invalid_key401 - the key is not valid.
pass_not_active403 - this pass is queued behind the current pass.
pass_expired403 - the pass expired. POST /v1/passes renews.
quota_exhausted403 - quota is spent. POST /v1/passes renews.
invalid_cursor400 - start again without the cursor parameter.
not_found404 - no event with this id.
invalid_filter400 - a filter value is not valid.
internal_error500 - try again later.

Limits

The catalog holds at most five providers, and it is shared.

The check runs once a day, with code. A change shows up after the next check.

History reaches back only as far as it exists, up to 90 days.

Where Vary cannot establish something, the event says unknown.

Failed calls never consume quota. Nothing is charged implicitly.

Changelog

2026-10-09 - Free product live: status, catalog, sample, pricing, daily check of nine sources.

2026-10-09 - Pass purchase cycle proven on Base Sepolia testnet: price, pay, access, renew, replay, refusal. MCP endpoint, discovery file and docs published.