{"api_version":"2.1.0","versioning_policy":{"scheme":"v1 path namespace (/api/v1) with a semantic API version string","current_version":"2.1.0","compatibility":"Within /api/v1, additive fields are safe and non-breaking. Existing fields, statuses and verdict semantics are not renamed or removed in place; a breaking change ships under a new path namespace (/api/v2).","deprecation":"A deprecated endpoint or field is announced in the changelog and the OpenAPI description, and kept for at least one full release cycle.","breaking_changes":"Breaking changes require a new major API version. The API version is the OpenAPI info.version and is never advanced silently."},"error_contract":[{"status":400,"code":"bad_request","retryable":false,"action":"Fix the request payload."},{"status":401,"code":"unauthorized","retryable":false,"action":"Provide a valid Authorization bearer token or X-API-Key."},{"status":402,"code":"payment_required","retryable":false,"action":"Upgrade or wait for the free-tier window to reset."},{"status":403,"code":"forbidden","retryable":false,"action":"Confirm tenant/organization membership and API key scope."},{"status":404,"code":"not_found","retryable":false,"action":"Check the resource id or path."},{"status":409,"code":"conflict","retryable":false,"action":"X-Idempotency-Key reused with a different body; use a new key for a new request."},{"status":413,"code":"payload_too_large","retryable":false,"action":"Reduce the payload size."},{"status":422,"code":"validation_error","retryable":false,"action":"Fix the flagged fields (no credits are consumed)."},{"status":429,"code":"rate_limited","retryable":true,"action":"Back off and retry with jitter (no credits are consumed)."},{"status":500,"code":"internal_error","retryable":true,"action":"Retry with the same X-Idempotency-Key; report with X-Request-ID if it persists."},{"status":503,"code":"service_unavailable","retryable":true,"action":"Retry with backoff; no credits are consumed on failure."}],"changelog":[{"version":"2.1.0","date":"2026-09-14","kind":"fixed","summary":"Reliance-grade corrections: Section 301 now fails closed (UNVERIFIED) for a Section 301 country when the packaged coverage is a curated subset, so a base-duty-only total is never presented as COMPLETE; a future shipment_date yields INCOMPLETE with ENTRY_DATE_IN_FUTURE / FUTURE_PROGRAM_STATE_UNVERIFIED instead of today's verified total; an incomplete national code keeps every registered duty component visible."},{"version":"2.1.0","date":"2026-09-14","kind":"fixed","summary":"Request-validation errors (422) now use the documented envelope {\"detail\":{\"error\":\"validation_error\",\"detail\":...,\"fields\":[...]}} instead of FastAPI's default list body. Invalid ISO country codes are 422; valid-but-unsupported destinations fail closed (REVIEW + UNSUPPORTED_JURISDICTION)."},{"version":"2.1.0","date":"2026-09-14","kind":"fixed","summary":"Idempotent replay: an explicit X-Idempotency-Key now yields a stable run_id across genuine retries (billed once); reports carry the duty component reason; the top-level evidence array is populated; SOURCE_UNAVAILABLE requirements are reported as missing/unavailable."},{"version":"2.0.0","date":"2026-09-14","kind":"added","summary":"US stacked-duty composition: POST /api/v1/duty/us-stack and duty_composition in Shipment Review (base/MFN, Section 301, Section 232, Chapter 99, AD/CVD boundary, preference) with effective dates, official sources and fail-closed totals."},{"version":"2.0.0","date":"2026-09-14","kind":"added","summary":"Regulatory change monitor: GET /api/v1/sources/changes (detected changes stay UNDER_REVIEW; never auto-activates legal rules)."},{"version":"2.0.0","date":"2026-09-14","kind":"added","summary":"Public versioning policy, error contract and changelog at GET /api/v1/version."},{"version":"2.0.0","date":"2026-09-14","kind":"added","summary":"GET /api/v1/sources official source registry with honest freshness."}],"openapi_version":"2.1.0","git_sha":"58aa8eee087a962381a94f6e90dc55da8883591c"}