Repository: CDCgov/prime-reportstream
Pull request #17732: Update API Guide with code mapping tool instructions (#16757)
Author: login: myduong-navapbc
Created: 2025-04-04T16:39:10Z | Merged: 2025-04-04T19:56:27Z

- Added new section
- Reordered old sections
- Included links to the mapping tool
- Body copy updates


Diff:
diff --git a/frontend-react/public/sitemap.xml b/frontend-react/public/sitemap.xml
index d6160779e0d..70024d05ff9 100644
--- a/frontend-react/public/sitemap.xml
+++ b/frontend-react/public/sitemap.xml
@@ -51,6 +51,9 @@
     <url>
         <loc>https://reportstream.cdc.gov/developer-resources/api</loc>
     </url>
+    <url>
+        <loc>https://reportstream.cdc.gov/developer-resources/api-onboarding-guide</loc>
+    </url>
     <url>
         <loc>https://reportstream.cdc.gov/developer-resources/api/getting-started</loc>
     </url>
diff --git a/frontend-react/src/AppRouter.tsx b/frontend-react/src/AppRouter.tsx
index 3ded631f8f0..45e447f643c 100644
--- a/frontend-react/src/AppRouter.tsx
+++ b/frontend-react/src/AppRouter.tsx
@@ -27,6 +27,11 @@ const GettingStartedReceivingData = lazy(
 const ReportStreamApiIndex = lazy(
     lazyRouteMarkdown(() => import("./content/developer-resources/reportstream-api/ReportStreamApi.mdx")),
 );
+const ApiOnboardingGuide = lazy(
+    lazyRouteMarkdown(
+        () => import("./content/developer-resources/reportstream-api/api-onboarding-guide/ApiOnboardingGuide.mdx"),
+    ),
+);
 const DeveloperResourcesIndex = lazy(lazyRouteMarkdown(() => import("./content/developer-resources/index-page.mdx")));
 const ReportStreamApiGettingStarted = lazy(
     lazyRouteMarkdown(
@@ -247,6 +252,14 @@ export const appRoutes: RouteObject[] = [
                                     isContentPage: true,
                                 },
                             },
+                            {
+                                path: "api-onboarding-guide",
+                                index: true,
+                                element: <ApiOnboardingGuide />,
+                                handle: {
+                                    isContentPage: true,
+                                },
+                            },
                             {
                                 path: "getting-started",
                                 element: <ReportStreamApiGettingStarted />,
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/ApiOnboardingGuide.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/ApiOnboardingGuide.mdx
new file mode 100644
index 00000000000..8aea6af106a
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/ApiOnboardingGuide.mdx
@@ -0,0 +1,174 @@
+---
+title: API onboarding guide
+subtitle: This programmer's guide helps you, the technical user at the testing facility, learn how to send data using the ReportStream Restful (REST) API.
+meta:
+    title: ReportStream developer resources | API onboarding guide
+    description: Technical documentation for establishing a connection and learning more about how ReportStream works
+    openGraph:
+        image:
+            src: /assets/img/opengraph/reportstream-tagline.png
+            altText: "ReportStream's mission is to provide a free data transfer platform that public health entities and healthcare organizations can rely on to meet all reporting needs."
+---
+
+import Sidenav from "../Sidenav.mdx";
+import Step3_1 from "./Step3_1.mdx";
+import Step3_2 from "./Step3_2.mdx";
+import Step3_3 from "./Step3_3.mdx";
+import Step3_4 from "./Step3_4.mdx";
+import Step4_1 from "./Step4_1.mdx";
+import Step4_2 from "./Step4_2.mdx";
+import Step4_3 from "./Step4_3.mdx";
+import Step4_4 from "./Step4_4.mdx";
+import site from "../../../site.json";
+
+<LayoutSidenav><Sidenav /></LayoutSidenav>
+
+<LayoutMain>
+
+    <p>Examples in this guide use curl commands for simplicity with the assumption you'll be coding these calls into your sending system. You can also use a program like Postman to test submissions.</p>
+
+    <p>On this page:</p>
+    <ol>
+        <li>[Create user account(s)](#create-user-accounts)</li>
+        <li>[Format and validate a fake data file](#format-and-validate-a-fake-data-file)</li>
+        <li>[Map your codes](#map-your-codes)</li>
+        <li>[Set up authentication and test your API connection](#set-up-authentication-and-test-your-api-connection)</li>
+        <li>[Test fake data in staging ](#test-fake-data-in-staging )</li>
+        <li>[Start sending data in production](#start-sending-data-in-production)</li>
+    </ol>
+
+    <p className="text-base">Last updated: 3/31/25</p>
+
+    <h2 id="create-user-accounts" className="rs-numbered">Create user account(s)</h2>
+
+    Before onboarding, you need to establish a ReportStream account. A ReportStream account will grant your organization access to a suite of tools used throughout the onboarding process and after go-live.
+
+    First, identify what member(s) of your organization will need logins. We recommend starting with the technical team and/or those who will require access to records of your past submissions to ReportStream. You can request additional members be added in the future.
+
+    Once your team members are identified, [contact our team](https://app.smartsheetgov.com/b/form/95d2f16b772c42d8aaa0ef5db28a6838) and provide their names and emails. We will set up logins accordingly. After your request is submitted, proceed to step 2.
+
+    <h2 id="format-and-validate-a-fake-data-file" className="rs-numbered">Format and validate a fake data file</h2>
+
+    Currently, ReportStream can accept either HL7 or FHIR data. We can provide a sample HL7 file with fake data to review <A href={site.forms.contactUs.url}>upon request</A>.
+
+    <Alert type="tip">For this step, you can refer to formatting requirements for 
+    [HL7v2.5.1 ORU-R01](https://www.hl7.org/implement/standards/product_brief.cfm?product_id=185) or 
+    [RADxMARS](https://www.nibib.nih.gov/covid-19/radx-tech-program/mars/hl7v2-getting-started) for OTC (over the counter) test data.</Alert>
+
+    When you've formatted your fake (non-PII) data file, test your data model using the
+    <A href={site.external.nistValidationSuite.url}>NIST Electronic Lab Reporting (ELR) Validation Suite</A>. 
+    Note: If you're testing OTC data, use the <A href={site.external.nistGeneralValidationTool.url}>NIST HL7 General Validation Tool</A> and 
+    select **RADx MARS HL7v2** from the **Tool Scopes** dropdown. Navigate to the **Context-free** tab and select the **Onboarding** profile group.
+    Correct any errors you receive.
+
+    <h2 id="map-your-codes" className="rs-numbered">Map your codes</h2>
+    We will ensure that all potential codes you might send to ReportStream are mapped in our system as part of your onboarding. First, format your result and organism codes in a CSV file using our <A href={site.assets.codeMapTemplate.path}>template</A>. Then, upload the CSV to our [code mapping tool <Icon name='Lock' className="text-ttop text-primary" />](https://reportstream.cdc.gov/onboarding/code-mapping). Correct any errors and send the results to your onboarding engineer. 
+    <Accordion bordered multiselectable items={[
+        {
+            headingLevel: "h3",
+            title: "Step 3.1: Set up your mapping file",
+            content: <Step3_1 />,
+            id: "3_1"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 3.2: Input all result codes",
+            content: <Step3_2 />,
+            id: "3_2"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 3.3: Input all organism codes (if applicable)",
+            content: <Step3_3 />,
+            id: "3_3"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 3.4: Upload your mapping file",
+            content: <Step3_4 />,
+            id: "3_4"
+        },
+    ]} />
+
+    <h2 id="set-up-authentication-and-test-your-api-connection" className="rs-numbered">Set up authentication and test your API connection</h2>
+
+    After you have finalized the formatting of your data, the ReportStream team will begin onboarding you to our staging environment.
+
+    As part of the onboarding process, the ReportStream team will assign your unique client-id and set up your ReportStream account 
+    with the type of data you will be submitting. ReportStream will use the client-id to look up the associated data model and format 
+    (FHIR or HL7) and validate the attached payload. 
+
+    Your first step in this phase is to set up your authentication.
+
+    ### Set up authentication with a public/private key pair
+
+    ReportStream uses token-based authentication with a public/private key pair.
+
+    The example below uses the fake `client-id healthy-labs` that you will change for your submissions. 
+    The examples submit the payload contained in the file `./healthy-labs-nonPII-data.hl7`. 
+    In the examples, data are submitted via an HTTP POST to the ReportStream staging system `reports` endpoint. 
+    The data submitted are sent as the payload of the POST, as is, with no changes. 
+
+    <Accordion bordered multiselectable items={[
+        {
+            headingLevel: "h3",
+            title: "Step 4.1: Prior to submission, send your public key to ReportStream.",
+            content: <Step4_1 />,
+            id: "4_1"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 4.2: At the time of submission, generate a signed JWT using your private key",
+            content: <Step4_2 />,
+            id: "4_2"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 4.3: Send the signed JWT to ReportStream to get a temporary bearer token",
+            content: <Step4_3 />,
+            id: "4_3"
+        },
+        {
+            headingLevel: "h3",
+            title: "Step 4.4: Submit data to ReportStream using the bearer token",
+            content: <Step4_4 />,
+            id: "4_4"
+        },
+    ]} />
+
+    ### Test your automation
+
+    Once authentication is complete, you can test your automation code as well as your code that handles responses using the staging API. 
+    Data is sent in the HTTP payload, either in FHIR or HL7 2.5.1 format. 
+    You can use curl commands, Postman, or another method of your choosing to post test submissions to the staging environment. 
+
+    <Alert type="tip">**Note:** Do not send any PII or PHI to the staging system — only fake (dummy, example, synthetic) data is acceptable.</Alert>
+
+    Let us know when you send submissions to the staging environment. We'll review that data and work with you to correct any issues. You may send as many fake data submissions to staging as is helpful.
+
+    For troubleshooting on your own, here is the complete endpoint input and response [OpenAPI specification](https://github.com/CDCgov/prime-reportstream/blob/master/prime-router/docs/api).
+
+    <h2 id="test-fake-data-in-staging" className="rs-numbered">Test fake data in staging</h2>
+
+    The ReportStream team will onboard you to the production system in training mode (staging). In staging, you will test your connection with ReportStream and send fake data. Utilize ReportStream's [History API](https://github.com/CDCgov/prime-reportstream/blob/main/prime-router/docs/universal-pipeline/submission-history.md) to obtain the status of your submission and any errors or warnings associated with it.
+
+    <h2 id="start-sending-data-in-production" className="rs-numbered">Start sending data in production</h2>
+
+    When you are ready, the ReportStream team will move you out of training mode and enable full production mode.
+
+    Once in production, data will automatically flow to appropriate state, local, and federal jurisdictional systems. You can view the record of your data and its status on the Submission History dashboard.
+
+    {
+    <Alert type="tip">
+        <span className="text-bold">Note:</span> Some jurisdictions require additional validation before sending data to their systems. If this affects your data submission, the ReportStream team will assist you in the process. Currently, the following states require additional validation:
+        <ul>
+            <li>California</li>
+            <li>Illinois</li>
+            <li>Washington</li>
+        </ul>
+    </Alert>
+    }
+
+    <LayoutBackToTop></LayoutBackToTop>
+
+</LayoutMain>
\ No newline at end of file
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_1.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_1.mdx
new file mode 100644
index 00000000000..69cd8da5a01
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_1.mdx
@@ -0,0 +1,85 @@
+---
+tableContent: [
+    [
+        {
+            columnKey: "Code",
+            columnHeader: "Code",
+            content: "97099-6",
+        },
+        {
+            columnKey: "Name",
+            columnHeader: "Name",
+            content: "Influenza virus A and B and SARS-CoV-2 (COVID-19) Ag panel - Upper respiratory specimen by Rapid immunoassay",
+        },
+        {
+            columnKey: "CodingSystem",
+            columnHeader: "Coding system",
+            content:
+                "LOINC",
+        },
+    ],
+    [
+        {
+            columnKey: "Code",
+            columnHeader: "Code",
+            content: "123456",
+        },
+        {
+            columnKey: "Name",
+            columnHeader: "Name",
+            content: "LDT Flu Test",
+        },
+        {
+            columnKey: "CodingSystem",
+            columnHeader: "Coding system",
+            content:
+                "LOCAL",
+        },
+    ],
+    [
+        {
+            columnKey: "Code",
+            columnHeader: "Code",
+            content: "47457-7",
+        },
+        {
+            columnKey: "Name",
+            columnHeader: "Name",
+            content: "Influenza virus A H8 Ab [Titer] in Serum",
+        },
+        {
+            columnKey: "CodingSystem",
+            columnHeader: "Coding system",
+            content:
+                "LOINC",
+        },
+    ],
+    [
+        {
+            columnKey: "Code",
+            columnHeader: "Code",
+            content: "115329001",
+        },
+        {
+            columnKey: "Name",
+            columnHeader: "Name",
+            content: "Methicillin resistant Staphylococcus aureus",
+        },
+        {
+            columnKey: "CodingSystem",
+            columnHeader: "Coding system",
+            content: "SNOMEDCT",
+        },
+    ],
+]
+---
+
+import { Table } from "../../../../shared";
+import site from "../../../site.json";
+
+
+Download our <A href={site.assets.codeMapTemplate.path}>template</A> that provides detailed instructions and correctly formatted columns.   
+
+If you do not want to use the template, you can also create your own file. The CSV file should only contain three columns labeled: Code, Name, and Coding system as shown in the example below. 
+
+<Table borderless rowData={frontmatter.tableContent} />
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_2.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_2.mdx
new file mode 100644
index 00000000000..df814521fe1
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_2.mdx
@@ -0,0 +1,7 @@
+Enter all result codes your organization will use to send data through ReportStream.   
+
+In column A (**Code**): Enter the coded value for all performed test results. This should be the value sent in `OBX-3.1` in an HL7 Message or `Bundle.entry.resource.ofType(Observation).code.coding.code` of a FHIR Observation resource.   
+
+In column B (**Name**): Enter the textual description of the code in column A. If the value in column A is a LOINC code, use the LOINC Long Common Name. If the value in column A is a local code, use a descriptive result name. 
+
+In column C (**Coding system**): Enter `LOINC` if the value in column A is a LOINC code. Enter `LOCAL` if the value is a local code.  
\ No newline at end of file
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_3.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_3.mdx
new file mode 100644
index 00000000000..23b77c2070d
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_3.mdx
@@ -0,0 +1,7 @@
+Input all codes for organisms that your organization will send through ReportStream. If you are not sending any reportable microbiological culture results, you can move on to Step 2.4.    
+
+In column A (**Code**): Enter the coded value for all potential reportable organisms. This should be the value sent in `OBX-5.1` in an HL7 Message or `Bundle.entry.resource.ofType(Observation).value CodableConcept.cod` of a FHIR Observation resource.   
+
+In column B (**Name**): Enter the textual description of the code in column A. If the value in column A is a SNOMED code, use the SNOMED description. If the value in column A is a local code, use a descriptive result name. 
+
+In column C (**Coding system**):  Enter `SNOMEDCT` if the value in column A is a SNOMED code. Enter `LOCAL` if the value is a local code.   
\ No newline at end of file
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_4.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_4.mdx
new file mode 100644
index 00000000000..4f57026b923
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_4.mdx
@@ -0,0 +1,4 @@
+import site from "../../../site.json";
+
+After completing the mapping file, export the column headers and filled rows as a CSV file. Upload that generated CSV to our [code mapping tool <Icon name='Lock' className="text-ttop text-primary" />](https://reportstream.cdc.gov/onboarding/code-mapping) and correct any errors. Once the errors are corrected, download any remaining unmapped codes as a CSV and send the file
+to your onboarding engineer or [reportstream@cdc.gov](mailto:reportstream@cdc.gov). We will review your codes and provide next steps to continue your onboarding. 
\ No newline at end of file
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_1.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_1.mdx
new file mode 100644
index 00000000000..91171f9c342
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_1.mdx
@@ -0,0 +1,26 @@
+import { CodeSnippet } from "../../../../shared";
+
+
+<ol>
+<li>
+Prior to connecting to the endpoint, you’ll need a public/private keypair. There are many ways to do this. The steps below show how to create a key pair using `openssl`.
+
+  EC
+<CodeSnippet>
+  openssl ecparam -genkey -name secp384r1 -noout -out my-es-keypair.pem
+  openssl ec -in my-es-keypair.pem -pubout -out  my-es-public-key.pem
+</CodeSnippet>
+
+  RSA
+<CodeSnippet>
+    openssl genrsa -out my-rsa-keypair.pem 2048
+    openssl rsa -in my-rsa-keypair.pem -outform PEM -pubout -out my-rsa-public-key.pem
+</CodeSnippet>
+
+</li>
+
+<li>Send the public key to the ReportStream team using [our public key tool](/manage-public-key).
+Note: you’ll need to login to use that feature. If you do not have a login contact ReportStream support at [reportstream@cdc.gov](mailto:reportstream@cdc.gov). ReportStream will associate the key with your configuration within ReportStream.</li>
+</ol>
+
+You only need to do this step once, not every time you submit reports. If you need to change your keys at any time, contact ReportStream support.
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_2.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_2.mdx
new file mode 100644
index 00000000000..b6b51ea7ad6
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_2.mdx
@@ -0,0 +1,36 @@
+import { CodeSnippet } from "../../../../shared";
+
+
+A JWT is a base64 encoded string that has three parts: `header`, `payload`, and `signature`.
+
+You can find an example python program to generate a valid JWT [on GitHub](https://github.com/CDCgov/prime-reportstream/tree/master/prime-router/examples/generate-jwt-python/).
+
+If you receive errors, reference [this list](https://github.com/CDCgov/prime-reportstream/tree/master/prime-router/examples/generate-jwt-python/jwt-errors.md) of error types for explanations and instructions.
+
+Here is an example, using the fake `client-id healthy labs`, of header and payload data that should appear in a ReportStream JWT, prior to signature:
+
+<CodeSnippet>
+    &#123;
+        &nbsp;&nbsp;"header": &#123;
+        &nbsp;&nbsp;&nbsp;&nbsp;"kid": "<span className="text-highlight">healthy-labs</span>.default",
+        &nbsp;&nbsp;&nbsp;&nbsp;"typ": "JWT",
+        &nbsp;&nbsp;&nbsp;&nbsp;"alg": "RS256"
+        &#125;,
+        &nbsp;&nbsp;"payload": &#123;
+        &nbsp;&nbsp;&nbsp;&nbsp;"iss": "<span className="text-highlight">healthy-labs</span>.default",
+        &nbsp;&nbsp;&nbsp;&nbsp;"sub": "<span className="text-highlight">healthy-labs</span>.default",
+        &nbsp;&nbsp;&nbsp;&nbsp;"aud": "staging.prime.cdc.gov",
+        &nbsp;&nbsp;&nbsp;&nbsp;"exp": 1660737164,
+        &nbsp;&nbsp;&nbsp;&nbsp;"jti": "4b713fcd-2514-4207-b310-620b95b749c5"
+        &nbsp;&nbsp;&#125;
+    &#125;
+</CodeSnippet>
+
+<Alert type="tip">
+    <span className="text-bold">Note:</span>
+    <ul>
+        <li>The exp (expiration time) should be a Unix time, five minutes after the time the token was generated.</li>
+        <li>The jti (JWT ID) should be a random unique string, new with every call.</li>
+        <li>Generate the signed JWT using your private key.</li>
+    </ul>
+</Alert>
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_3.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_3.mdx
new file mode 100644
index 00000000000..6919f81b689
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_3.mdx
@@ -0,0 +1,27 @@
+import { CodeSnippet } from "../../../../shared";
+
+
+POST to the token URL, as in the example below, noting the following:
+1. Use Content-Type: application/x-www-form-urlencoded.
+2. In the `scope` parameter, replace the dummy string `‘healthy-labs’` with your client-id, as assigned to you by ReportStream staff.
+3. The `grant_type` and `client_assertion_type` parameters are always fixed values. The `grant_type` should be `client_credentials` and `client_assertion_type` should be `urn:ietf:params:oauth:client-assertion-type:jwt-bearer`, as in the example curl below.
+4. In the client_assertion parameter, replace the \<token-signing-secret\> below with your JWT from above.
+5. All the parameters are sent in the body/payload of the post (when using curl, via the `-d` option), not in the URL.
+Here is an example ‘curl’ POST:
+
+<CodeSnippet>
+    curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "scope=<span className="text-highlight">healthy-labs</span>.*.report&grant_type=client_credentials&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=&lt;token-signing-secret&gt;"
+        "https://staging.prime.cdc.gov/api/token"
+</CodeSnippet>
+
+You should get something like this back, which will be valid for five minutes:
+
+<CodeSnippet>
+    &#123;
+    &nbsp;&nbsp;"access_token": &lt;long-access-token&gt;
+    &nbsp;&nbsp;"token_type": "bearer",
+    &nbsp;&nbsp;"expires_in": 300,
+    &nbsp;&nbsp;"expires_at_seconds": 1625260982,
+    &nbsp;&nbsp;"scope": "<span className="text-highlight">healthy-labs</span>.*.report"
+    &#125;
+</CodeSnippet>
diff --git a/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_4.mdx b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_4.mdx
new file mode 100644
index 00000000000..62f267783c2
--- /dev/null
+++ b/frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step4_4.mdx
@@ -0,0 +1,14 @@
+import { CodeSnippet } from "../../../../shared";
+
+
+Use the access token returned above as the bearer token for the submission:
+
+HL7 example
+
+<CodeSnippet>
+&#123;
+    curl -H "authorization:bearer&lt;long-bearer-token&gt;" -H "client:<span className="text-highlight">healthy-labs</span>"  -H "content-type:application/hl7-v2" --data-binary "@./<span className="text-highlight">healthy-labs</span>-nonPII-data.hl7" "https://staging.prime.cdc.gov/api/waters"
+&#125;
+</CodeSnippet>
+
+Again, always remember to replace the healthy-labs client-id with the client-id supplied to you by ReportStream staff.
\ No newline at end of file


Reviews:
user: login: jillian-hammer
body: LGTM! thank you @myduong-navapbc 
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-04-04T19:46:29Z
user: login: etanb
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-07T18:56:53Z
user: login: myduong-navapbc
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-07T18:59:47Z

Review comments:
diff_hunk: @@ -0,0 +1,4 @@
+import site from "../../../site.json";
+
+After completing the mapping file, export the column headers and filled rows as a CSV file. Upload that generated CSV to our [code mapping tool <Icon name='Lock' className="text-ttop text-primary" />](https://reportstream.cdc.gov/onboarding/code-mapping) and correct any errors. Once the errors are corrected, download any remaining unmapped codes as a CSV and send the file
path: frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_4.mdx
user: login: etanb
body: nit: we have a mix of `/relative/paths` and some absolute ones here. should settle on one style. could even see a case for adding to our `site.json`.
created_at: 2025-04-07T18:56:53Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,4 @@
+import site from "../../../site.json";
+
+After completing the mapping file, export the column headers and filled rows as a CSV file. Upload that generated CSV to our [code mapping tool <Icon name='Lock' className="text-ttop text-primary" />](https://reportstream.cdc.gov/onboarding/code-mapping) and correct any errors. Once the errors are corrected, download any remaining unmapped codes as a CSV and send the file
path: frontend-react/src/content/developer-resources/reportstream-api/api-onboarding-guide/Step3_4.mdx
user: login: myduong-navapbc
body: correct, this will be updated in a separate upcoming pr
created_at: 2025-04-07T18:59:47Z
author_association: COLLABORATOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-04-04T16:39:23Z
body: <h1>Dependency Review</h1>
✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.<h2>OpenSSF Scorecard</h2>
<table><tr><th>Package</th><th>Version</th><th>Score</th><th>Details</th></tr>
</table><h2>Scanned Manifest Files</h2>


<!-- dependency-review-pr-comment-marker -->
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-04T16:43:08Z
body: Branch deployed to Chromatic 🚀. 
- ⚠️ Detected 0 tests with visual changes.
- ✅ All tests passed.

View via: 
- Chromatic: https://www.chromatic.com/build?appId=6419b81d4a47163c3050f14a&number=1586
- Storybook: https://6419b81d4a47163c3050f14a-slzulfwict.chromatic.com/
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-04-04T16:44:39Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=CDCgov_prime-data-hub&pullRequest=17732) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=CDCgov_prime-data-hub&pullRequest=17732&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=CDCgov_prime-data-hub&pullRequest=17732&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=CDCgov_prime-data-hub&pullRequest=17732&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [50.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=CDCgov_prime-data-hub&pullRequest=17732&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=CDCgov_prime-data-hub&pullRequest=17732&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=CDCgov_prime-data-hub&pullRequest=17732)


author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-04T16:51:32Z
body: ## ⚠️ Broken Links ⚠️

❌ https://www.hhs.gov/vulnerability-disclosure-policy/index.html

**Error:** `Request failed with status code 403`

---

❌ https://www.fedramp.gov/program-basics/

**Error:** `Request failed with status code 404`

---

❌ /assets/xlsm/20241204_ReportStream-Mapping-Template.xlsm

**Error:** `Internal link: Page error`

---

❌ https://www.cdc.gov/poxvirus/mpox/lab-personnel/report-results.html

**Error:** `Request failed with status code 404`

---
author_association: CONTRIBUTOR