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.
sortonGET /v1/prices:price(the default: ascending amount, ties by distance) ordistance(ascending distance, ties by amount). The originalprice_ascstill works asprice; any other value is 400invalid_sort.- Page size is 20 (default and maximum). A larger
limitis 400limit_too_largerather than being quietly reduced. Cursors last 60 minutes and keep the first page's sort and radius. The 100-result depth limit is gone. summaryon every/v1/pricesresponse:count,min_price,median_price,max_priceandnearest_distance_miles, over all results before paging, identical on every page./v1/healthis liveness only.rowsanddata_as_ofare gone from it, andmeta.data_as_ofis 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.counttells 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_exceededis no longer returned;/v1/accountshows the new limits. /v1/searchis catalog-only. It returns services, never prices, and is never billed. Thenearparameter 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_byand is billed on its own;joined_existingis alwaysfalse. - 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}/updatesand/disputes) now require a key with thecontributescope. 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/benchmarksnow counts as a Read when it returns a distribution. Test keys are still free. See Billing. - Updates:
POST /v1/prices/{id}/updatesis the new name for reporting that a provider quoted something different.POST /v1/prices/{id}/disputesstill works, and price records carrylinks.updatealongsidelinks.dispute. - Display: the disclaimer is the only required display element. Attribution is optional, so
attribution.requiredis nowfalse, anddisclosurenow 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/searchwithout prices in the answer is no longer billed as a Read.GET /v1/prices/changesno 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=,amountnow includes the requested add-ons for every service, matchingincluded_in_amount. market=now searches the market's own radius when you don't passradius_miles.GET /v1/price-requests?to=<date>now includes that whole day.- Error responses now carry
Cache-Control: private, no-store, andWellward-Modefor 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_scenarioexercises every error. - Keys are now
wl_test_…/wl_live_…, named, and can be rotated with overlap. Existingwwk_keys keep working. Keys may also be sent asX-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, nestedaddons[],service_coverage,attributionanddisclosure;zipas an alias ofnear;radius_miles75 and 100.serviceis now required (amarketwithout one used to return every service's prices together). - Coverage:
services[]with per-service counts andfull/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-*andRetry-Afteron every 429. - Billing: per-Read pricing for live keys; usage, statements, spending caps.
API reference · Dashboard · Questions: hello@wellwardhealth.com