getreadystack commited on
Commit
da415a5
·
verified ·
1 Parent(s): a4e32a0

Upload index.html with huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +367 -17
index.html CHANGED
@@ -1,19 +1,369 @@
1
  <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  </html>
 
1
  <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>CMS-0057 API Gate - FHIR CapabilityStatement — free online check</title>
7
+ <style>
8
+ :root{color-scheme:light}body{margin:0;font:15px/1.55 system-ui,-apple-system,"Segoe UI",sans-serif;background:#faf9f5;color:#1a1512}
9
+ .wrap{max-width:960px;margin:0 auto;padding:28px 18px 60px}h1{font-size:26px;margin:0 0 6px}.lede{color:#4a403a;margin:0 0 16px}
10
+ textarea{width:100%;min-height:260px;font:13px/1.45 ui-monospace,Menlo,Consolas,monospace;padding:12px;border:1px solid #d9d0c4;border-radius:8px;box-sizing:border-box}
11
+ .bar{display:flex;gap:10px;align-items:center;margin:12px 0}button{font:600 15px system-ui;padding:10px 18px;border:0;border-radius:8px;background:#1a1512;color:#fff;cursor:pointer}
12
+ input[type=date]{font:14px system-ui;padding:8px;border:1px solid #d9d0c4;border-radius:6px}
13
+ table{border-collapse:collapse;width:100%;font-size:14px;margin-top:10px}th,td{text-align:left;padding:8px 10px;border-bottom:1px solid #eee;vertical-align:top}th{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#7a6e65}
14
+ .sev.error{color:#a8551f;font-weight:700}.sev.warn,.sev.warning{color:#96691f}.ok{color:#2a6446;font-weight:600}.sum{font-weight:600}
15
+ .note{font-size:13px;color:#7a6e65;margin-top:18px}#paid{margin-top:22px;padding:14px 16px;border:1px solid #e2d8cb;border-radius:10px;background:#fffdfa}
16
+ </style>
17
+ <script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
18
+ <!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/cms-0057-api-gate"></head>
19
+ <body>
20
+ <div class="wrap">
21
+ <h1>CMS-0057 API Gate - FHIR CapabilityStatement</h1>
22
+ <p class="lede">Audit a FHIR CapabilityStatement against the CMS-0057-F prior authorization rule before the 1 January 2027 compliance date, without leaving the editor. Runs entirely in your browser — nothing is uploaded.</p>
23
+ <textarea id="src" spellcheck="false">{
24
+ "resourceType": "CapabilityStatement",
25
+ "id": "payer-patient-access",
26
+ "url": "https://fhir.example-health-plan.com/metadata",
27
+ "version": "1.0.4",
28
+ "name": "ExamplePlanPatientAccess",
29
+ "title": "Example Health Plan - Patient Access API (CMS-9115-F build)",
30
+ "status": "active",
31
+ "date": "2021-07-01",
32
+ "publisher": "Example Health Plan, Medicare Advantage contract H1234",
33
+ "kind": "instance",
34
+ "implementation": {
35
+ "description": "Patient Access and Provider Directory APIs delivered for the 2021 interoperability rule",
36
+ "url": "https://fhir.example-health-plan.com/r4"
37
+ },
38
+ "fhirVersion": "4.0.1",
39
+ "format": ["application/fhir+json"],
40
+ "implementationGuide": [
41
+ "http://hl7.org/fhir/us/carin-bb/ImplementationGuide/hl7.fhir.us.carin-bb"
42
+ ],
43
+ "rest": [
44
+ {
45
+ "mode": "server",
46
+ "security": {
47
+ "service": [
48
+ {"coding": [{"system": "http://terminology.hl7.org/CodeSystem/restful-security-service", "code": "SMART-on-FHIR"}]}
49
+ ],
50
+ "extension": [
51
+ {
52
+ "url": "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris",
53
+ "extension": [
54
+ {"url": "authorize", "valueUri": "http://auth.example-health-plan.com/authorize"},
55
+ {"url": "token", "valueUri": "https://auth.example-health-plan.com/token"}
56
+ ]
57
+ }
58
+ ]
59
+ },
60
+ "resource": [
61
+ {
62
+ "type": "Patient",
63
+ "supportedProfile": ["http://hl7.org/fhir/us/carin-bb/StructureDefinition/C4BB-Patient"],
64
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
65
+ },
66
+ {
67
+ "type": "Coverage",
68
+ "supportedProfile": ["http://hl7.org/fhir/us/carin-bb/StructureDefinition/C4BB-Coverage"],
69
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
70
+ },
71
+ {
72
+ "type": "ExplanationOfBenefit",
73
+ "supportedProfile": ["http://hl7.org/fhir/us/carin-bb/StructureDefinition/C4BB-ExplanationOfBenefit"],
74
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
75
+ },
76
+ {
77
+ "type": "Organization",
78
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
79
+ },
80
+ {
81
+ "type": "Practitioner",
82
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
83
+ },
84
+ {
85
+ "type": "InsurancePlan",
86
+ "interaction": [{"code": "read"}, {"code": "search-type"}]
87
+ }
88
+ ]
89
+ }
90
+ ]
91
+ }</textarea>
92
+ <div class="bar"><button id="go">Check</button><label>as of <input type="date" id="today"></label></div>
93
+ <div id="out" aria-live="polite"></div>
94
+ <div id="nextstep" style="margin:14px 0;padding:12px;border:1px solid #d9d0c4;border-radius:8px;background:#fffaf2"><a href="https://buy.polar.sh/polar_cl_RqXjvqSVkQXgBWNS56pWMaOQRkjbpSGQuPGL50WDgb6" data-polar-checkout data-polar-checkout-theme="light" style="font-weight:600;color:#7a3b00">Export this audit as a dated Markdown + CSV gap report</a><br><small>$29 once &middot; one licence key per person or team seat &middot; 7-day full refund. A payer interoperability readiness review from an interop consultancy is commonly quoted as a five-figure engagement.</small></div>
95
+ <div id="paid"><strong>Free here:</strong> Audit any FHIR CapabilityStatement in the editor and see every CMS-0057-F gap with its citation and the days left to 1 January 2027.. <strong>In the editor:</strong> Export the same audit as a dated Markdown + CSV gap report, one row per gap with its citation, for the compliance file an auditor asks for. — that part asks for a licence key.</div>
96
+ <p class="note">Same engine as the VS Code extension, byte for byte.</p>
97
+ </div>
98
+ <script>var CMS57_RULES = [
99
+ {
100
+ "id": "fhir_r4",
101
+ "sev": "error",
102
+ "kind": "version",
103
+ "anchor": "\"fhirVersion\"",
104
+ "msg": "No fhirVersion is declared. The CMS-0057-F APIs must be conformant to HL7 FHIR Release 4.0.1 (R4).",
105
+ "msg_bad": "fhirVersion is {v}. The CMS-0057-F APIs must be conformant to HL7 FHIR Release 4.0.1 (R4); an STU3 or R5 server does not satisfy the rule."
106
+ },
107
+ {
108
+ "id": "us_core_profiles",
109
+ "sev": "error",
110
+ "kind": "require_any",
111
+ "anchor": "\"rest\"",
112
+ "patterns": [
113
+ "hl7\\.org/fhir/us/core"
114
+ ],
115
+ "msg": "No US Core profile is referenced anywhere in the statement. The CMS-0057-F APIs must return the USCDI clinical data set through US Core R4 profiles."
116
+ },
117
+ {
118
+ "id": "smart_oauth",
119
+ "sev": "error",
120
+ "kind": "require_any",
121
+ "anchor": "\"rest\"",
122
+ "patterns": [
123
+ "SMART-on-FHIR",
124
+ "smart-app-launch",
125
+ "oauth-uris"
126
+ ],
127
+ "msg": "No SMART App Launch / OAuth 2.0 security service is declared. The Patient Access API must let a member authorise a third-party app without contacting the payer."
128
+ },
129
+ {
130
+ "id": "tls_endpoints",
131
+ "sev": "error",
132
+ "kind": "forbid",
133
+ "patterns": [
134
+ "\"(address|authorize|token|manage|revoke|endpoint)\"\\s*:\\s*\"http://",
135
+ "\"valueUri\"\\s*:\\s*\"http://"
136
+ ],
137
+ "msg": "A plaintext http:// endpoint is declared. Every CMS-0057-F API endpoint, including the OAuth 2.0 authorize and token URLs, must be TLS-protected."
138
+ },
139
+ {
140
+ "id": "patient_access_eob",
141
+ "sev": "error",
142
+ "kind": "require_any",
143
+ "anchor": "\"rest\"",
144
+ "patterns": [
145
+ "\"type\"\\s*:\\s*\"ExplanationOfBenefit\""
146
+ ],
147
+ "msg": "Patient Access API: no ExplanationOfBenefit resource is declared, so adjudicated claims and encounter data cannot be returned to the member."
148
+ },
149
+ {
150
+ "id": "patient_access_prior_auth",
151
+ "sev": "error",
152
+ "kind": "require_any",
153
+ "anchor": "\"rest\"",
154
+ "patterns": [
155
+ "\"type\"\\s*:\\s*\"ClaimResponse\""
156
+ ],
157
+ "msg": "Patient Access API: no ClaimResponse resource is declared. CMS-0057-F adds prior authorization requests and decisions (drugs excluded) to the Patient Access API from 1 January 2027."
158
+ },
159
+ {
160
+ "id": "prior_auth_submit",
161
+ "sev": "error",
162
+ "kind": "require_any",
163
+ "anchor": "\"rest\"",
164
+ "patterns": [
165
+ "\\$submit",
166
+ "\"name\"\\s*:\\s*\"submit\"",
167
+ "OperationDefinition/Claim-submit"
168
+ ],
169
+ "msg": "Prior Authorization API: no Claim $submit operation is declared, so a provider cannot send a prior authorization request to this server."
170
+ },
171
+ {
172
+ "id": "prior_auth_inquire",
173
+ "sev": "warn",
174
+ "kind": "require_any",
175
+ "anchor": "\"rest\"",
176
+ "patterns": [
177
+ "\\$inquire",
178
+ "\"name\"\\s*:\\s*\"inquire\""
179
+ ],
180
+ "msg": "Prior Authorization API: no $inquire operation is declared. Without it a provider cannot check the status of a pending prior authorization."
181
+ },
182
+ {
183
+ "id": "dtr_questionnaire",
184
+ "sev": "warn",
185
+ "kind": "require_any",
186
+ "anchor": "\"rest\"",
187
+ "patterns": [
188
+ "\\$questionnaire-package",
189
+ "\"name\"\\s*:\\s*\"questionnaire-package\""
190
+ ],
191
+ "msg": "Documentation requirements: no $questionnaire-package operation is declared, so the payer's documentation rules are not machine-readable to the provider's EHR."
192
+ },
193
+ {
194
+ "id": "provider_access_export",
195
+ "sev": "error",
196
+ "kind": "require_any",
197
+ "anchor": "\"rest\"",
198
+ "patterns": [
199
+ "\\$export",
200
+ "\"name\"\\s*:\\s*\"export\""
201
+ ],
202
+ "msg": "Provider Access API: no bulk $export operation is declared. CMS-0057-F requires payers to share member data with in-network providers from 1 January 2027."
203
+ },
204
+ {
205
+ "id": "payer_to_payer_match",
206
+ "sev": "error",
207
+ "kind": "require_any",
208
+ "anchor": "\"rest\"",
209
+ "patterns": [
210
+ "\\$member-match",
211
+ "\"name\"\\s*:\\s*\"member-match\""
212
+ ],
213
+ "msg": "Payer-to-Payer API: no $member-match operation is declared, so a previous payer cannot identify this member and hand over their data at enrolment."
214
+ },
215
+ {
216
+ "id": "server_mode",
217
+ "sev": "error",
218
+ "kind": "require_any",
219
+ "anchor": "\"rest\"",
220
+ "patterns": [
221
+ "\"mode\"\\s*:\\s*\"server\""
222
+ ],
223
+ "msg": "No REST server mode is declared. A CapabilityStatement offered as evidence for a CMS-0057-F API must describe a server, not a client."
224
+ },
225
+ {
226
+ "id": "statement_stale",
227
+ "sev": "warn",
228
+ "kind": "stale_date",
229
+ "anchor": "\"date\"",
230
+ "msg": "The statement is dated {d} and is {n} days old. Auditors read the date first: refresh it as the APIs are built out."
231
+ },
232
+ {
233
+ "id": "deadline_clock",
234
+ "sev": "info",
235
+ "kind": "clock",
236
+ "anchor": "\"resourceType\"",
237
+ "msg": "{n} days left until the CMS-0057-F compliance date of 1 January 2027, with {e} blocking gaps still open in this statement.",
238
+ "msg_past": "The CMS-0057-F compliance date of 1 January 2027 passed {n} days ago and {e} blocking gaps are still open in this statement."
239
+ }
240
+ ];</script>
241
+ <script>/* CMS-0057 API Gate - engine
242
+ * Reads a FHIR CapabilityStatement (JSON text) and reports the gaps that stop it
243
+ * from standing as evidence for the four CMS-0057-F APIs due 1 January 2027.
244
+ * Same file runs in Node (extension) and in the browser (free web page).
245
+ */
246
+ const RULES = (typeof module !== 'undefined') ? require('./rules.json') : window.CMS57_RULES;
247
+
248
+ const DEADLINE = '2027-01-01';
249
+ const STALE_DAYS = 365;
250
+ const DAY = 86400000;
251
+
252
+ function daysBetween(a, b) {
253
+ return Math.round((Date.parse(b + 'T00:00:00Z') - Date.parse(a + 'T00:00:00Z')) / DAY);
254
+ }
255
+
256
+ function lineOf(lines, src) {
257
+ if (!src) return 1;
258
+ let re;
259
+ try { re = new RegExp(src); } catch (e) { return 1; }
260
+ for (let i = 0; i < lines.length; i++) if (re.test(lines[i])) return i + 1;
261
+ return 1;
262
+ }
263
+
264
+ function fill(msg, vals) {
265
+ return String(msg).replace(/\{(\w+)\}/g, function (m, k) {
266
+ return Object.prototype.hasOwnProperty.call(vals, k) ? String(vals[k]) : m;
267
+ });
268
+ }
269
+
270
+ function check(text, opts) {
271
+ opts = opts || {};
272
+ const today = /^\d{4}-\d{2}-\d{2}$/.test(opts.today || '') ? opts.today : '2026-09-16';
273
+ const src = String(text == null ? '' : text);
274
+ const lines = src.split(/\r?\n/);
275
+ const findings = [];
276
+ const push = function (rule, msg, line) {
277
+ findings.push({ check: rule.id, sev: rule.sev, msg: String(msg).replace(/\b1 days\b/g, '1 day'), line: line || 1 });
278
+ };
279
+
280
+ RULES.forEach(function (rule) {
281
+ if (rule.kind === 'version') {
282
+ const m = src.match(/"fhirVersion"\s*:\s*"([^"]+)"/);
283
+ const line = lineOf(lines, rule.anchor);
284
+ if (!m) push(rule, rule.msg, lineOf(lines, '"resourceType"'));
285
+ else if (!/^4\.0/.test(m[1])) push(rule, fill(rule.msg_bad, { v: m[1] }), line);
286
+ return;
287
+ }
288
+ if (rule.kind === 'require_any') {
289
+ const hit = (rule.patterns || []).some(function (p) { return new RegExp(p).test(src); });
290
+ if (!hit) push(rule, rule.msg, lineOf(lines, rule.anchor));
291
+ return;
292
+ }
293
+ if (rule.kind === 'forbid') {
294
+ (rule.patterns || []).forEach(function (p) {
295
+ const re = new RegExp(p);
296
+ for (let i = 0; i < lines.length; i++) {
297
+ if (re.test(lines[i])) { push(rule, rule.msg, i + 1); return; }
298
+ }
299
+ });
300
+ return;
301
+ }
302
+ if (rule.kind === 'stale_date') {
303
+ const m = src.match(/"date"\s*:\s*"(\d{4}-\d{2}-\d{2})/);
304
+ if (!m) return;
305
+ const age = daysBetween(m[1], today);
306
+ if (age > STALE_DAYS) push(rule, fill(rule.msg, { d: m[1], n: age }), lineOf(lines, '"date"'));
307
+ return;
308
+ }
309
+ if (rule.kind === 'clock') {
310
+ const errs = findings.filter(function (f) { return f.sev === 'error'; }).length;
311
+ if (!errs) return;
312
+ const left = daysBetween(today, DEADLINE);
313
+ const line = lineOf(lines, rule.anchor);
314
+ if (left >= 0) push(rule, fill(rule.msg, { n: left, e: errs }), line);
315
+ else push(rule, fill(rule.msg_past, { n: -left, e: errs }), line);
316
+ }
317
+ });
318
+
319
+ return { findings: findings };
320
+ }
321
+
322
+ const API = { engine: { check: check }, RULES: RULES, RULE_COUNT: RULES.length };
323
+ if (typeof module !== 'undefined') module.exports = API;
324
+ if (typeof window !== 'undefined') window.CMS57ENGINE = API;
325
+ </script>
326
+ <script>// ⛔뼈대 — kit/scaffold.py 가 찍는다 (s143). findings [{check,sev,msg,line?}] → 글/HTML. 같은 파일이 Node 와 브라우저에서 산다.
327
+ 'use strict';
328
+ function escapeHtml(s) { return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;'); }
329
+ function summaryLine(res) {
330
+ const f = (res && res.findings) || []; const e = f.filter(function (x) { return String(x.sev || 'error').toLowerCase().startsWith('err'); }).length;
331
+ return f.length ? (f.length + ' finding' + (f.length === 1 ? '' : 's') + ' (' + e + ' error' + (e === 1 ? '' : 's') + ')') : 'Clean — no findings.';
332
+ }
333
+ function toText(res, label) {
334
+ const f = (res && res.findings) || [];
335
+ const lines = ['== ' + (label || '') + ' — ' + summaryLine(res)];
336
+ f.forEach(function (x) { lines.push(' ' + String(x.sev || 'error').toUpperCase().slice(0, 4) + ' ' + (x.line ? 'L' + x.line + ' ' : '') + (x.check || x.id || '') + ' ' + (x.msg || x.message || '')); });
337
+ return lines.join('\n');
338
+ }
339
+ function toHtml(res) {
340
+ const f = (res && res.findings) || [];
341
+ if (!f.length) return '<p class="ok">' + escapeHtml(summaryLine(res)) + '</p>';
342
+ const rows = f.map(function (x) { return '<tr><td class="sev ' + escapeHtml(String(x.sev || 'error')) + '">' + escapeHtml(String(x.sev || 'error')) + '</td><td>' + (x.line ? 'L' + escapeHtml(x.line) : '') + '</td><td><code>' + escapeHtml(x.check || x.id || '') + '</code></td><td>' + escapeHtml(x.msg || x.message || '') + '</td></tr>'; }).join('');
343
+ return '<p class="sum">' + escapeHtml(summaryLine(res)) + '</p><table><thead><tr><th>Level</th><th>Line</th><th>Check</th><th>What</th></tr></thead><tbody>' + rows + '</tbody></table>';
344
+ }
345
+ var CMS57REPORT = { escapeHtml: escapeHtml, summaryLine: summaryLine, toText: toText, toHtml: toHtml };
346
+ if (typeof module !== 'undefined' && module.exports) module.exports = CMS57REPORT;
347
+ else window.CMS57REPORT = CMS57REPORT;
348
+ </script>
349
+ <script>
350
+ (function(){
351
+ var src=document.getElementById('src'), out=document.getElementById('out'), go=document.getElementById('go'), today=document.getElementById('today');
352
+ today.value=new Date().toISOString().slice(0,10);
353
+ function run(){ try { var res=window.CMS57ENGINE.engine.check(src.value,{today:today.value}); out.innerHTML=window.CMS57REPORT.toHtml(res); } catch(e){ out.innerHTML='<p class="sev error">Could not run: '+String(e.message||e)+'</p>'; } }
354
+ go.onclick=run; if (src.value.trim()) run();
355
+ })();
356
+ </script>
357
+ <script defer data-auto-init src="https://cdn.jsdelivr.net/npm/@polar-sh/checkout@latest/dist/embed.global.js"></script>
358
+
359
+
360
+ <section data-yj-install="free" style="margin:2rem auto 1rem;max-width:46rem;padding:1.25rem 1.25rem;border:1px solid #cfe3d6;border-radius:12px;background:#f6fbf8;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .4rem;font-size:1.2rem">Install free</h2><p style="margin:0 0 .8rem;color:#41505f">Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.</p><a href="https://marketplace.visualstudio.com/items?itemName=ReadyStack.cms-0057-api-gate" rel="noopener" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">VS Code Marketplace</a><a href="https://www.npmjs.com/package/@readystack/cms-0057-api-gate" rel="noopener" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">npm</a><a href="https://hub.docker.com/r/getreadystack/cms-0057-api-gate" rel="noopener" style="display:inline-block;margin:0 .5rem .5rem 0;padding:.6rem 1rem;border-radius:8px;background:#0f7b3f;color:#fff;text-decoration:none;font-weight:600">Docker Hub</a><pre style="margin:.5rem 0 0;padding:.6rem .8rem;background:#f3f5f8;border-radius:8px;font-size:.9rem;overflow:auto">ext install ReadyStack.cms-0057-api-gate
361
+ npx @readystack/cms-0057-api-gate &lt;file&gt;
362
+ docker run --rm -v &quot;$PWD:/w&quot; getreadystack/cms-0057-api-gate /w</pre><p style="margin:.6rem 0 0;font-size:.92rem;color:#41505f"><a href="https://buy.polar.sh/polar_cl_l6iN1uWt0FwWu7tBsczD0jWpP2vxFM54Wdwqb3KPi1G" rel="nofollow" style="color:#0f7b3f;text-decoration:underline">Team? One key for every ReadyStack linter, 5 seats, $149 once</a></p></section>
363
+ <section data-yj-alert="rule" style="margin:1rem auto 1.5rem;max-width:46rem;padding:1.1rem 1.25rem;border:1px solid #d9dee6;border-radius:12px;background:#fbfcfd;font:15px/1.55 system-ui,-apple-system,Segoe UI,sans-serif"><b style="font-size:1.05rem">Get one email when this rule changes</b><div style="opacity:.78;margin:.35rem 0 .8rem">We watch the regulation and vendor sources behind CMS-0057 API Gate every day. When a rule changes, you get a single email with what changed and the updated check. No newsletter.</div><div style="display:flex;gap:8px;flex-wrap:wrap"><input id="yjae" type="email" placeholder="you@example.com" style="flex:1;min-width:210px;padding:11px 13px;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:#fff;color:inherit"><button id="yjab" style="padding:11px 18px;border-radius:8px;border:0;cursor:pointer;background:#0f7b3f;color:#fff;font:600 15px system-ui,sans-serif">Notify me</button></div><div id="yjao" hidden style="margin-top:.6rem;color:#0f7b3f">You're on the list. One email when it changes.</div><script>(function(){var b=document.getElementById("yjab"),e=document.getElementById("yjae");if(!b||!e)return;b.addEventListener("click",function(){var v=e.value.trim();if(!/.+@.+\..+/.test(v))return;try{localStorage.setItem("yj_em","1");}catch(_){}fetch(location.origin+"/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:v,slug:"cms-0057-api-gate",lang:"en",source:"rule_alert"})}).then(function(r){var o=document.getElementById("yjao");o.hidden=false;if(!r.ok){o.textContent="Could not save - please try again.";}}).catch(function(){var o=document.getElementById("yjao");o.hidden=false;o.textContent="Could not save - please try again.";});});})();</script></section>
364
+
365
+ <section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version <span class="yj-price">$29</span></h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">14 rules read a FHIR CapabilityStatement against CMS-0057-F. A 2021 payer statement returned 6 blocking gaps - three of the four APIs missing - and 107 days left to 1 January 2027.</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">A payer interoperability readiness review from an interop consultancy is commonly quoted as a five-figure engagement.</p><a href="https://buy.polar.sh/polar_cl_RqXjvqSVkQXgBWNS56pWMaOQRkjbpSGQuPGL50WDgb6" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Buy the full version — $29</a></section>
366
+ <section data-yj="yj-facts-v1" style="max-width:920px;margin:48px auto 0;padding:0 20px;font-family:system-ui,sans-serif"><style>.yj-article p{font:400 15.5px/1.7 system-ui,sans-serif;color:#26313b;margin:0 0 12px;max-width:72ch}.yj-article h2,.yj-article h3,.yj-article h4{font:600 17px/1.35 system-ui,sans-serif;color:#1b1f24;margin:22px 0 8px}.yj-article table{border-collapse:collapse;margin:10px 0 16px;font:14px/1.45 system-ui,sans-serif}.yj-article th,.yj-article td{border:1px solid #e2e6ea;padding:6px 10px;text-align:left}.yj-article th{background:#f4f6f8}.yj-article pre{background:#0f1720;color:#e6edf3;padding:12px 14px;border-radius:8px;overflow:auto;font:13px/1.5 ui-monospace,Menlo,monospace}.yj-article code{font:13px ui-monospace,Menlo,monospace;background:#f1f3f5;padding:1px 4px;border-radius:3px}.yj-article pre code{background:none;padding:0}.yj-article ul,.yj-article ol{font:15px/1.6 system-ui,sans-serif;color:#26313b}</style><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:34px 0 6px;color:#1b1f24">Questions people ask</h2><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What does CMS-0057 API Gate actually do?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">It reads a FHIR CapabilityStatement as you edit it and reports, line by line, which of the four CMS-0057-F APIs it cannot yet stand as evidence for: Patient Access, Provider Access, Payer-to-Payer and Prior Authorization. 14 rules run, and a clock shows the days left to 1 January 2027.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Who is it for?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Health IT engineers at Medicare Advantage organizations, state Medicaid and CHIP programs, and QHP issuers on the federal exchanges, plus the FHIR vendors building those servers. If your team owns the /metadata endpoint that CMS-0057-F will be judged on, this is your file.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">Why is a free FHIR validator not enough?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A generic FHIR validator calls this file valid, because it checks the statement against the FHIR R4 schema, not against a federal rule. Schema-valid is the normal state of a payer server that is still missing Claim $submit, Group $export and $member-match. The rule, not the schema, is what CMS reads.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What is free and what costs money?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">Every check is free and needs no licence key: all 14 rules, every finding, every file, no limit. The paid tier changes who holds the result, not how much you can see. $29 once exports the same audit as a dated Markdown and CSV gap report with one row per gap and its CMS-0057-F citation.</p></details><details style="border-bottom:1px solid #e6e9ed;padding:10px 0"><summary style="cursor:pointer;font:600 15px/1.4 system-ui,sans-serif;color:#1b1f24">What would this cost otherwise?</summary><p style="margin:8px 0 2px;font:400 14.5px/1.6 system-ui,sans-serif;color:#33404b">A payer interoperability readiness review from an interop consultancy is commonly quoted as a five-figure engagement. This extension does not replace that review; it removes the mechanical gaps before you pay for one, so the consultant reads the hard questions instead of your missing operations.</p></details><script type="application/ld+json" data-yj="yj-faq-ld">{"@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [{"@type": "Question", "name": "What does CMS-0057 API Gate actually do?", "acceptedAnswer": {"@type": "Answer", "text": "It reads a FHIR CapabilityStatement as you edit it and reports, line by line, which of the four CMS-0057-F APIs it cannot yet stand as evidence for: Patient Access, Provider Access, Payer-to-Payer and Prior Authorization. 14 rules run, and a clock shows the days left to 1 January 2027."}}, {"@type": "Question", "name": "Who is it for?", "acceptedAnswer": {"@type": "Answer", "text": "Health IT engineers at Medicare Advantage organizations, state Medicaid and CHIP programs, and QHP issuers on the federal exchanges, plus the FHIR vendors building those servers. If your team owns the /metadata endpoint that CMS-0057-F will be judged on, this is your file."}}, {"@type": "Question", "name": "Why is a free FHIR validator not enough?", "acceptedAnswer": {"@type": "Answer", "text": "A generic FHIR validator calls this file valid, because it checks the statement against the FHIR R4 schema, not against a federal rule. Schema-valid is the normal state of a payer server that is still missing Claim $submit, Group $export and $member-match. The rule, not the schema, is what CMS reads."}}, {"@type": "Question", "name": "What is free and what costs money?", "acceptedAnswer": {"@type": "Answer", "text": "Every check is free and needs no licence key: all 14 rules, every finding, every file, no limit. The paid tier changes who holds the result, not how much you can see. $29 once exports the same audit as a dated Markdown and CSV gap report with one row per gap and its CMS-0057-F citation."}}, {"@type": "Question", "name": "What would this cost otherwise?", "acceptedAnswer": {"@type": "Answer", "text": "A payer interoperability readiness review from an interop consultancy is commonly quoted as a five-figure engagement. This extension does not replace that review; it removes the mechanical gaps before you pay for one, so the consultant reads the hard questions instead of your missing operations."}}]}</script><div id="yj-ask" style="margin:36px 0 0;padding:18px 18px 16px;border:1px solid #e2e6ea;border-radius:10px;background:#fbfbfc"><h2 style="font:600 19px/1.3 system-ui,sans-serif;margin:0 0 4px;color:#1b1f24">Ask about this tool</h2><p style="font:400 13.5px/1.5 system-ui,sans-serif;margin:0 0 12px;color:#5b6570">One question, answered by the person who built it. Your email only if you want the answer sent.</p><form onsubmit="return yjAsk(event)" style="display:grid;gap:8px"><textarea name="question" required minlength="10" maxlength="2000" rows="3" placeholder="Your question" style="font:14px/1.5 system-ui,sans-serif;padding:10px;border:1px solid #cfd6dd;border-radius:6px"></textarea><div style="display:flex;gap:8px;flex-wrap:wrap"><input type="email" name="email" placeholder="Email (optional)" style="flex:1;min-width:200px;font:14px system-ui,sans-serif;padding:9px 10px;border:1px solid #cfd6dd;border-radius:6px"><button type="submit" style="font:600 14px system-ui,sans-serif;padding:9px 18px;border:0;border-radius:6px;background:#1b1f24;color:#fff;cursor:pointer">Send</button></div><p id="yj-ask-msg" style="font:13px system-ui,sans-serif;margin:2px 0 0;color:#0a6238;min-height:1em"></p></form><script>function yjAsk(e){e.preventDefault();var f=e.target,m=document.getElementById("yj-ask-msg");m.style.color="#0a6238";fetch(location.origin+"/api/ask",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sku:0,slug:"cms-0057-api-gate",lang:"en",question:f.question.value,email:f.email.value,page:location.pathname})}).then(function(r){if(!r.ok)throw 0;m.textContent="Thanks \u2014 noted. Answers land on this page and, if you left an email, in your inbox.";f.question.value="";}).catch(function(){m.style.color="#a8551f";m.textContent="Could not send. Please try again in a minute.";});return false;}</script></div></section><section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">Same job, next tool</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Free in the browser. The full version is a one-time licence, 7-day refund.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/dotnet-eol-support-gate"><span class="yj-rel-t">.NET EOL &amp; CRA Support Window Gate</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/robots-txt-ai-crawler-audit"><span class="yj-rel-t">AI Crawler Rules - robots.txt Audit for AI Search</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/angular-removed-api-lint"><span class="yj-rel-t">Angular Removed-API Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/bulk-sender-lint"><span class="yj-rel-t">Bulk Sender Lint - the Gmail, Yahoo and Outlook.com rules, checked in your mai</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/coverage-gate-lint"><span class="yj-rel-t">Coverage Gate Lint</span><span class="yj-rel-p">$29</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/devicetree-config-language-pack"><span class="yj-rel-t">DeviceTree Config Audit: 23 dtc-Style Rules, 50 Snippets</span><span class="yj-rel-p">$29</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section><!--yj-share-s101--><div style="margin:28px 0 8px;text-align:center"><button id="yjcp" type="button" style="font:inherit;padding:10px 18px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Copy link</button><button id="yjimg" type="button" style="font:inherit;padding:10px 18px;margin-left:8px;border:1px solid #8884;border-radius:10px;background:transparent;cursor:pointer">Save result as image</button></div><script>(function(){var b=document.getElementById("yjimg");if(!b)return;b.addEventListener("click",function(){var o=document.getElementById("out");var txt=(o&&(o.innerText||o.textContent)||"").trim();if(!txt){b.textContent="(no result yet)";setTimeout(function(){b.textContent="Save result as image";},1500);return;}var lines=txt.split(String.fromCharCode(10)).filter(function(x){return x.trim();}).slice(0,10);var W=1200,P=56,c=document.createElement("canvas");c.width=W;var lh=38,H=P*2+70+lines.length*lh+60;c.height=H;var x=c.getContext("2d");x.fillStyle="#1a1512";x.fillRect(0,0,W,H);x.fillStyle="#f3e9d2";x.font="600 34px system-ui,Segoe UI,Arial";var t=(document.title||"").split("|")[0].trim();x.fillText(t.slice(0,54),P,P+34);x.font="22px ui-monospace,Menlo,Consolas,monospace";x.fillStyle="#e8dcc4";for(var i=0;i<lines.length;i++){x.fillText(lines[i].slice(0,88),P,P+70+i*lh+22);}x.font="600 22px system-ui,Segoe UI,Arial";x.fillStyle="#c9a227";var d=location.hostname.replace("www.","");x.fillText(d,W-P-x.measureText(d).width,H-P+6);c.toBlob(function(bl){var u=URL.createObjectURL(bl),a=document.createElement("a");a.href=u;a.download=(t||"result").replace(/[^a-z0-9]+/gi,"-").toLowerCase()+"-"+d+".png";document.body.appendChild(a);a.click();setTimeout(function(){URL.revokeObjectURL(u);a.remove();},2000);},"image/png");});})();</script><script>(function(){var b=document.getElementById("yjcp");if(!b)return;var t=b.textContent;b.addEventListener("click",function(){var u=location.href.split("#")[0];function d(){b.textContent="Link copied";setTimeout(function(){b.textContent=t;},1800);}if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(u).then(d,function(){prompt("",u);});}else{prompt("",u);}});})();</script><div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div>
367
+ <script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en",ref:(document.referrer||'')})}).catch(function(){});}catch(e){}})();</script>
368
+ </body>
369
  </html>