overlay: 1.0.0
info:
title: API Evangelist enhancements for Planomy Tax Data JSON
version: 1.0.0
extends: openapi/planomy-tax-data-openapi.yml
x-provenance:
generated: '2026-08-09'
method: generated
source: >-
Live probes of https://planomy.net/tax-data/ plus the published documentation at
https://planomy.net/data/ and https://planomy.net/embed/
note: >-
Planomy publishes no OpenAPI, so the document this overlay extends is itself API
Evangelist-authored from observed responses. This overlay carries the enrichment layer — rating
metadata, the observed-vs-documented CORS divergence, caching guidance and the cross-links to the
rest of the repo — separately from the description of the wire behaviour.
actions:
- target: $.info
update:
x-apievangelist-profile: https://apis.io/provider/planomy-tax-data/
x-apievangelist-repo: https://github.com/api-evangelist/planomy-tax-data
x-authentication: none
x-artifacts:
conventions: conventions/planomy-tax-data-conventions.yml
errors: errors/planomy-tax-data-problem-types.yml
lifecycle: lifecycle/planomy-tax-data-lifecycle.yml
data-model: data-model/planomy-tax-data-data-model.yml
conformance: conformance/planomy-tax-data-conformance.yml
json-schema: json-schema/planomy-tax-data-tax-year-dataset.json
components: components/planomy-tax-data-components.yml
agentic-access: agentic-access/planomy-tax-data-agentic-access.yml
- target: $.info
update:
x-cors:
documented: false
observed: true
observed_header: 'access-control-allow-origin: *'
preflight: OPTIONS returns 405, so only CORS simple requests succeed.
verified: '2026-08-09'
note: >-
The published documentation states no CORS header is sent. The deployed edge sends a
wildcard. Stated policy and deployed behaviour disagree; the header is undocumented and
could be withdrawn without notice.
- target: $.info
update:
x-freshness:
cadence: >-
Upstream-driven. Retirement-plan limits late October / early November, HSA figures in
spring, Medicare premiums in November.
signals: [publishedAt, lastUpdated, 'sources.*.retrieved']
recommended_poll: >-
Conditional GET with If-None-Match, no more than daily. The origin answered 304 on
2026-08-09.
- target: $.paths['/tax-data/{year}.json'].get
update:
x-caching:
strategy: conditional-get
etag: strong
example_request_header: 'If-None-Match: "8642a3ae66c6d4201323c66ae6e07c15"'
verified_304: true
x-agent-guidance: >-
Resolve `year` from getTaxDataIndex. A year that is valid but unpublished and a malformed
year both return the same HTML 404, so the manifest is the only reliable way to tell them
apart.
- target: $.paths['/tax-data/index.json'].get
update:
x-agent-guidance: >-
Call this first. `latest` is the year to use unless the caller named one; `years[]` is the
complete set; `yearUrlTemplate` is how to build the URL.
- target: $.components.schemas.StateTaxPreset
update:
x-coverage-warning: >-
Ten keys only (NONE, PA, IL, MA, VA, CA, NY, NJ, OR, MN) — a preset list for the Planomy
planner, not 50-state coverage. Only the explicit `NONE` key means "no state income tax"; a
state that is simply absent is unmodelled, and treating absence as zero will understate tax.
- target: $.components.schemas.SourceReference
update:
x-why-this-matters: >-
This is the provider's strongest design decision. Every section carries a `source` key into
this map, so any single figure can be traced to a named IRS, SSA, CMS or Federal Register
document with the date Planomy last checked it. Agents citing a figure should cite through
this map, not through planomy.net.
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.