← Guides

Changelog

Try it on a test key

curl -s "https://api.wellwardhealth.com/v1/health"

2026-09-25 — Status page measured from outside

The status page now reports the API, webhook delivery and the developer portal as measured by external checks every few minutes, plus incidents our team posts — nothing else.

2026-09-25 — Sorting, page size, summary, per-page Reads

One billing change: each page of /v1/prices results is now a Read. The rest is additive.

  • sort on GET /v1/prices: price (the default: ascending amount, ties by distance) or distance (ascending distance, ties by amount). The original price_asc still works as price; any other value is 400 invalid_sort.
  • Page size is 20 (default and maximum). A larger limit is 400 limit_too_large rather than being quietly reduced. Cursors last 60 minutes and keep the first page's sort and radius. The 100-result depth limit is gone.
  • summary on every /v1/prices response: count, min_price, median_price, max_price and nearest_distance_miles, over all results before paging, identical on every page.
  • /v1/health is liveness only. rows and data_as_of are gone from it, and meta.data_as_of is gone from every response — data freshness is an internal signal; our promise is that every price was quoted within 364 days.
  • Reference and guides reorganized into eight groups and four sections. Bulk data is no longer in the public reference; it is available under an enterprise agreement.
  • Every page is a Read. A follow-up page used to be free within an hour; now each page that returns prices is one Read. summary.count tells you how many pages a full pull takes. An identical call within 60 seconds still counts once.

2026-09-24 — API Terms v2.1

The API Terms were updated; an org admin is asked to accept them again in the dashboard (Billing). What changed: 30 days' notice (was 60) before a new or higher fee; don't blend Wellward prices with other sources' prices into one figure (aggregates of Wellward prices alone are fine); stop showing a withdrawn price within 24 hours; the price-request band is "that market or comparable markets"; and §9 now describes exactly what we log.

2026-09-24 — Limits per organization, catalog-only search

Some of these remove things from /v1. There are no live customers yet, so they ship without the 90-day notice.

  • Limits are now per organization, not per key, and test and live are counted separately. Prices and benchmarks: 5/second, 5,000/day. Search: 2/second, 1,000/day. Price requests: 2/second, 500/day. Everything else: 20/second, 100,000/day. 1,200 calls a minute overall.
  • Price records per day: an org is served at most 10,000 price records in any 24 hours (2,500 for a new account until its first invoice is paid), counting follow-up pages. One query pages through at most 100 results.
  • Monthly quotas and tiers are retired. quota_exceeded is no longer returned; /v1/account shows the new limits.
  • /v1/search is catalog-only. It returns services, never prices, and is never billed. The near parameter is gone; take the slug to /v1/prices.
  • /v1/providers/{id} lists what we price at a practice, not the prices.
  • Price requests are never joined. Each request has its own expected_by and is billed on its own; joined_existing is always false.
  • The spending cap now also stops new live price requests. New accounts have a lower monthly cap until the first invoice is paid.
  • Updates (POST /v1/prices/{id}/updates and /disputes) now require a key with the contribute scope. A reported price joins your changes feed and webhooks, so you hear when it changes.

2026-09-24 — API Terms v2 and flat pricing

Nothing existing was removed. One change adds a charge: GET /v1/benchmarks is now billed when it returns a distribution.

  • Pricing is flat and per usage: one rate per Read and one per completed price request (see the pricing page). GET /v1/benchmarks now counts as a Read when it returns a distribution. Test keys are still free. See Billing.
  • Updates: POST /v1/prices/{id}/updates is the new name for reporting that a provider quoted something different. POST /v1/prices/{id}/disputes still works, and price records carry links.update alongside links.dispute.
  • Display: the disclaimer is the only required display element. Attribution is optional, so attribution.required is now false, and disclosure now returns the disclaimer text. See Displaying prices.
  • Versioning: 90 days' notice before a field or endpoint is removed or renamed within a version. A version may be retired six months after its successor is announced.

Fixes

  • GET /v1/search without prices in the answer is no longer billed as a Read.
  • GET /v1/prices/changes no longer skips events that share a timestamp at a page boundary.
  • Webhook retries now run the full schedule (about 24 hours); they stopped after about 9.
  • With addons=, amount now includes the requested add-ons for every service, matching included_in_amount.
  • market= now searches the market's own radius when you don't pass radius_miles.
  • GET /v1/price-requests?to=<date> now includes that whole day.
  • Error responses now carry Cache-Control: private, no-store, and Wellward-Mode for test keys.
  • At the spend cap, MCP now pauses only the billed tools.

2026-09-23 — Self-serve launch

All additive; nothing existing was renamed or removed.

  • Self-serve accounts. Sign up and get a test key immediately. Orgs, team members and roles (admin, developer, billing).
  • Test mode. wl_test_ keys read a fixed fictional dataset and never create work; test_scenario exercises every error.
  • Keys are now wl_test_… / wl_live_…, named, and can be rotated with overlap. Existing wwk_ keys keep working. Keys may also be sent as X-Api-Key.
  • Only valid prices. Every price is inside a 364-day freshness window and currently valid. Withdrawn prices answer 410 with withdrawn_at.
  • Prices: as_of, nested addons[], service_coverage, attribution and disclosure; zip as an alias of near; radius_miles 75 and 100. service is now required (a market without one used to return every service's prices together).
  • Coverage: services[] with per-service counts and full / partial / none.
  • New endpoints: /v1/meta/attribution, /v1/prices/changes, /v1/usage, /v1/account, GET /v1/price-requests, POST /v1/price-requests/{id}/cancel, POST /v1/webhooks/{id}/test, GET /v1/webhooks/{id}/deliveries.
  • Price requests: state, outcome, billable, price_ids; Idempotency-Key; provider_id, variant_key, max_age_days, metadata; 402 / 409 / 422 refusals.
  • Webhooks: request.completed, request.expired, price.withdrawn, price.updated, billing.payment_failed, usage.threshold_reached; Wellward-Signature: t=,v1=; retries for about a day.
  • Rate limits per endpoint class, with X-RateLimit-* and Retry-After on every 429.
  • Billing: per-Read pricing for live keys; usage, statements, spending caps.

API reference · Dashboard · Questions: hello@wellwardhealth.com