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_proofFree 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/pricingBuy 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/passEvery 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
| id | string - stable event id, e.g. evt_20261009_a1b2 |
| provider | string - provider slug, e.g. openai |
| service | string - service slug, e.g. model_api |
| type | string - one of the six event types |
| field | string - what changed, e.g. input_price |
| old_value | string or null - unknown stays null |
| new_value | string or null - unknown stays null |
| context | string or null - region, tier or conditions |
| official_url | string - the source URL the check watched |
| published_at | string or null - provider publication date, UTC |
| detected_at | string - when the daily check found it, UTC |
| effective_at | string or null - known effective date, UTC |
| verification_status | string - verified, unverified, ambiguous or corrected |
| corrects_event_id | string or null - set when this event corrects another |
Event types
Errors
Every error is JSON with code, message and docs_url.
| payment_required | 402 - a Pass is required. The body carries the x402 requirements. |
| payment_invalid | 402 - the facilitator refused the payment. Nothing was charged again. |
| payment_unavailable | 503 - the purchase path is down. Free endpoints stay open. |
| invalid_key | 401 - the key is not valid. |
| pass_not_active | 403 - this pass is queued behind the current pass. |
| pass_expired | 403 - the pass expired. POST /v1/passes renews. |
| quota_exhausted | 403 - quota is spent. POST /v1/passes renews. |
| invalid_cursor | 400 - start again without the cursor parameter. |
| not_found | 404 - no event with this id. |
| invalid_filter | 400 - a filter value is not valid. |
| internal_error | 500 - 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.