Introduction
The CareFirst API Platform follows industry-standard protocols to expose CareFirst API(s) using the REST/JSON and OAuth 2.0 security protocols. API stands for Application Programming Interface, which is a software intermediary that allows two applications to talk to each other.
Developers need to register their application in the sandbox to start building and testing their application. Once the application is tested in the sandbox with non-production data, the developer can promote the configuration to production and request approval. CareFirst will approve the application to connect to the production environment.
CareFirst has multiple plans like CHPCDC, CHPMD, etc. Documentation and API(s) use lines of business (LOB) terms. Please refer to the additional information section for more details.
API Security
CareFirst APIs are secured using the OAuth 2.0 security protocol, which is the industry standard for applications to integrate with APIs. OAuth 2.0 is an authorization framework that allows applications to obtain limited access to user information via APIs.
Additionally, all client applications must include an HTTP header (x-api-subscription-key) with a valid subscription key assigned to their application.
OAuth 2.0 Protocol
CareFirst uses OAuth 2.0 protocols for authentication since APIs exchange members' protected health information with third-party applications upon authorization from the member. To access CareFirst's APIs in the sandbox, your application needs to use the Authorization Code grant type.
OAuth Grant Types
Authorization Code
The Authorization Code grant type is used by web and mobile apps. It is used by both web apps and native apps to obtain an access token after a user authorizes an application. Below are very high-level steps:
- The application opens a browser to send the user to the OAuth server.
- The user authenticates and grants the application access.
- The user is redirected back to the application with an authorization code.
- The application requests an access token from the OAuth server by presenting the authorization code.
Client Credentials
This flow is useful when the party that requires access to an API is a machine. This is a machine-to-machine authorization flow. In this case, the client is the resource owner, and no end-user authorization is required. An example is a CRON job acting as a client and calling an API to perform a function.
Client Credentials Grant using JWT Assertion
In the Client Credentials Grant with JWT Assertion, a machine-to-machine flow, the client authenticates by creating and signing a JWT (client_assertion) locally instead of transmitting a password or client secret. The JWT must include mandatory claims (iss, sub, aud, exp) and is signed using the client's private key. This approach provides enhanced security by keeping credentials local and limiting token validity through expiration windows, reducing the risk of credential exposure.
Register as a Developer
Developers can register themselves in the API Marketplace as either an Individual Developer or a Company Developer. Company registration includes various types of healthcare organizations such as payers, brokers, and partners.
Note: This registration process is only for external developers. If you are an Internal CareFirst Developer, you can access the API Marketplace directly using Single Sign-On (SSO) with your CareFirst credentials.
Company Registration
At the top-right corner of the API Marketplace, click the Register button. This will redirect you to the registration page, where you'll need to select the appropriate developer type from the options below:
- Healthcare Broker Developer
- Healthcare Partner Developer
- Healthcare Payer Developer
- Healthcare Provider Developer – Learn more about the registration process.
Developers or technical account representatives from external health insurance brokerage agencies, such as Full-Service Producers (FSP), who aim to integrate their applications with CareFirst APIs to meet their business needs using CareFirst APIs.
Developers or technical account representatives from CareFirst external partners with business agreements, excluding payers or brokers.
Developers or technical account representatives from external health insurance payers who seek to integrate their applications to transfer patient data from CareFirst in order to comply with the Payer-to-Payer Data Exchange CMS Interoperability Final Rule.
Developers or technical account representatives from healthcare provider organizations, including hospitals, health systems, physician practices, clinics, and EHR/EMR vendors, who seek to integrate their systems with CareFirst APIs to support clinical workflows such as eligibility verification, prior authorization, care coordination, and patient data exchange in compliance with applicable interoperability regulations.
Step 2: Company Information
After selecting a developer type, you will be redirected to the Company Information page. A multi-step form will appear, and you must complete all required fields to successfully register.
Required Fields:
- Company Legal Name*
- Company Email Domain*
- Employer Identification Number*
Example: CareTech Solutions
Enter the legal name of your company or organization.
Example: Caretechsolutions.com
Enter the official email domain used by your organization (e.g., the part after @ in your company email addresses).
Example: 12-3456789
Enter your organization's valid EIN. This is used for verification and compliance purposes.
Consent Checkbox
Select the checkbox to agree to the following:
You and your entity agree to abide by all HIPAA rules (Health Insurance Portability and Accountability Act of 1996 (HIPAA) | CDC) and to the extent the requested data could include substance abuse patient records, applicable provisions of 42 CFR Part 2. By completing and submitting the registration, you are hereby affirming that you are doing so on behalf of a HIPAA Covered Entity.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 3: Company Address
In this step, provide the following required information to define your organization's physical location and contact details. This information helps us verify your identity and ensure secure interaction with our APIs.
Required Fields:
- Street Address*
- Suite#
- State*
- City*
- Zip Code*
- Phone*
- Website Url*
Example: 1234 Innovation Drive
Enter the street address of your company's primary office location.
Example: Suite 500
Enter the suite, unit, or floor number if applicable. Leave blank if not applicable.
Example: MD
Enter the state or province.
Example: Baltimore
Enter the city where your company is located.
Example: 21201
Enter the ZIP or postal code for your company's address.
Example: +1 (410) 555-1234
Enter a valid business phone number. This may be used for verification or support purposes.
Example: https://www.caretechsolutions.com
Enter your company's official website URL.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 4: Customer Service Information
In this step, provide the contact details for your customer service team. This information will be used by CareFirst to communicate important updates and provide support related to your application:
Required Fields:
- Customer Service Email
- Customer Service Phone
Example: support@caretechsolutions.com
Enter the email address where your team will receive important notifications, updates, and support-related inquiries regarding your application.
Example: +1 (800) 555-1234
Provide a U.S.-based phone number that our support team can use to contact your application's primary support representative.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 5: Primary Contact Information
In this step, provide the details of the primary point of contact for your organization. This individual will be responsible for managing communication and coordination related to your application.
Required Fields:
- First Name*
- Last Name*
- Company Email Address*
- Company Phone Number*
- Designation*
Example: John
Enter the first name of the primary contact person.
Example: Doe
Enter the last name of the primary contact person.
Example: john.doe@caretechsolutions.com
Enter the official company email address of the primary contact. This will be used for all formal communications.
Example: +1 (410) 555-7890
Provide a direct phone number where the primary contact can be reached during business hours.
Example: CIO / Director / Manager / VP
Select the appropriate job title or role of the primary contact from the available options.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 6: Secondary Contact Information
In this step, provide the details of the secondary point of contact for your organization. This individual will be responsible for managing communication and coordination related to your application.
Required Fields:
- First Name*
- Last Name*
- Company Email Address*
- Company Phone Number*
- Designation*
Example: Tony
Enter the first name of the secondary contact person.
Example: Brave
Enter the last name of the secondary contact person.
Example: tony.brave@caretechsolutions.com
Enter the official company email address of the secondary contact. This will be used for all formal communications.
Example: +1 (410) 555-7890
Provide a direct phone number where the secondary contact can be reached during business hours.
Example: CIO / Director / Manager / VP
Select the appropriate job title or role of the primary contact from the available options.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 7: Account Email Information
Note: This is the email address that will be used to authenticate to the system.
In this step, provide the account email address that will be used to log in and access the API Marketplace. This email will also receive system notifications and authentication-related communications.
Required Fields:
- Account Email Address*
Example: tony.stark@caretechsolutions.com
Enter the official email address that will serve as the login credential for accessing the system.
Note: The account email must match the company email domain provided in Step 2. We recommend using a distribution list (DL) rather than a personal email address to ensure continuity of access and proper account management.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 8: Confirm Email Address
A 6-digit security code has been sent to your email. Please check your messages and enter the code below.
Note: The code will expire after 3 minutes or if you request a new one.
This step ensures that the email address provided is valid and accessible, as it will be used for authentication and important system communications.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
You may also click the Resend OTP button if you did not receive the code, and the Verify button to confirm the entered code.
Step 9: Set Password
In this step, you will create a secure password for your account. This password, along with your registered email address, will be used to log in to the API Marketplace.
Required Fields:
- Password*:
- Set Password*
Example: P@ssw0rd!23
Create a strong password that meets security requirements. It should include a combination of uppercase and lowercase letters, numbers, and special characters.
Example: P@ssw0rd!23
Re-enter the same password to confirm it matches. This ensures there are no typos or mismatches.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 10: Terms of Use
Required Fields:
In this step, you are required to review and accept the Terms of Use before completing your registration.
These Terms of Use (Agreement) apply to your use of any CareFirst materials or services for which you have been or may be granted access.
CareFirst Developer Account Enrollment.
You agree to provide and maintain accurate contact information with CareFirst. You represent and warrant that: (i) all information you have provided and will provide to CareFirst is true, correct and complete in all respects and you will promptly notify CareFirst of any changes to such information; (ii) you are at least 18 years of age and have the legal right, power, and authority to accept the terms and conditions of this Agreement on behalf of yourself and on behalf of any company that you represent and (iii) any materials you provide, create or develop related to this Agreement do not and will not infringe any Intellectual Property Rights of any third party; and (iv) you are not a Restricted Person.
Select the checkbox to confirm your agreement and click the Submit button to proceed to the confirmation page.
To return to the previous page, click the Back button.
After clicking the Submit button, the user will be redirected to a confirmation page.
Company accounts require CareFirst team approval before use. You cannot log in until your account is reviewed and activated. You will receive an email notification once approved.
Access the Registration Page - Individual Registration
Click the Register button located at the top-right corner of the API Marketplace. You will be redirected to the registration page, where you must select the appropriate developer type from the option below:
- Healthcare Individual Developer
Developers or technical account representatives from external health insurance entities who seek to innovate the healthcare industry by creating applications that allow patients to access their data from CareFirst.
Step 1: Developer Information
After selecting a developer type, you will be redirected to the Developer Information page. A multi-step form will appear, and you must complete all required fields to proceed with registration.
In this step, provide the details of the primary point of contact for your organization. This individual will be responsible for managing communication and coordination related to your application.
Required Fields:
- First Name*
- Last Name*
- Account Email*
- From Company*
- Phone Number*
Example: John
Enter the first name of the contact person.
Example: Doe
Enter the last name of the contact person.
Example: john.doe@caretechsolutions.com
Enter the official email address of the contact. This will be used for all formal communications.
Example: CareTech Solutions
Enter the name of the company or organization the primary contact represents.
Example: +1 (410) 555-7890
Provide a direct phone number where the primary contact can be reached during business hours.
Select the checkbox to agree to the following:
By providing my wireless phone number, I agree and acknowledge that CareFirst may send text messages to my wireless phone number for OTP Authentication. Message and data rates may apply.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 2: Confirm Phone Number
This step ensures that the phone number provided is valid and accessible, as it will be used for authentication and important system communications.
A 6-digit security code has been sent to your email.
Please check your messages and enter the code below.
Note: The code will expire after 3 minutes or if you request a new one.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
You may also click the Resend OTP button if you did not receive the code, and the Verify button to confirm the entered code.
Step 3: Confirm Email Address
A 6-digit security code has been sent to your email.
Please check your messages and enter the code below.
Note: The code will expire after 3 minutes or if you request a new one.
This step ensures that the email address provided is valid and accessible, as it will be used for authentication and important system communications.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
You may also click the Resend OTP button if you did not receive the code, and the Verify button to confirm the entered code.
Step 4: Set Password
In this step, you will create a secure password for your account. This password, along with your registered email address, will be used to log in to the API Marketplace.
Required Fields:
- Password*:
- Set Password*
Example: P@ssw0rd!23
Create a strong password that meets security requirements. It should include a combination of uppercase and lowercase letters, numbers, and special characters.
Example: P@ssw0rd!23
Re-enter the same password to confirm it matches. This ensures there are no typos or mismatches.
Once all fields are completed, click the Next button to proceed to the next step.
To return to the previous page, click the Back button.
Step 5: Terms of Use
Required Fields:
In this step, you are required to review and accept the Terms of Use before completing your registration.
These Terms of Use (Agreement) apply to your use of any CareFirst materials or services for which you have been or may be granted access.
Select the checkbox to confirm your agreement and click the Submit button to proceed to the confirmation page.
To return to the previous page, click the Back button.
After clicking the Submit button, the user will be redirected to a confirmation page.
Log In as a Developer
Click the Log In button on the menu bar.
Enter your registered email address and click Continue.
You will receive an OTP (One-Time Password) code sent to your account email. Enter this OTP code and click Verify.
Upon successful OTP verification, you will be prompted to enter your password.
After entering your password, you will be logged in as a developer and can access the API Marketplace.
Note: If you don't receive the code, please check your spam folder or request a new one.
Register Your Application
Follow the steps below to register a new application in the API Marketplace.
Step 1: Accessing the API Marketplace
To begin the application registration process, the user must log in as either an External Developer or an Internal Developer.
Once logged in, navigate to My Workspace, located at the top-right corner of the portal. Under My Workspace, select the Manage Application option.
Clicking on Manage Application will redirect the user to the application management page. On this page, at the bottom, the user will find a New App Registration button. Clicking this button initiates the creation of a new application.
Step 2: After clicking New App Registration, a multi-step form will appear. The user must complete all steps to successfully register the application.
Completing the Registration Form.
Application Details
In this step, provide the following required information:
- Application Component Name
- Application Component Description
- Business Purpose*
- Application URL*
- Outbound IPs
- Attestation Certificates URL
- App Logo URL
- Privacy Policy URL
- Terms of Use URL
Example: CFClaimsViewer
Enter the display name of the application component.
Example: A web-based tool for viewing and managing healthcare claims data.
Provide a detailed description of the application component.
Example: This application allows providers to access CareFirst APIs to retrieve patient claims data for billing and reconciliation.
Clearly explain the business purpose and use case for the application. Include why access to CareFirst APIs is required and how the application will utilize them.
Example (External): https://example.com
Example (Internal): https://www.carefirst.com
Provide the primary URL where the application is hosted. This should be the main address users will visit to access the application.
Note: For internal users, use https://www.carefirst.com as a placeholder if an external-facing URL is not applicable.
Example: 192.168.1.10, 192.168.1.11
List the public outbound IP addresses that the application will use to connect to CareFirst APIs.
Example: https://example.com/certs
Provide the URL where the application's attestation certificates can be accessed.
Example: https://example.com/logo.png
Provide the URL for the application's logo.
Example: https://example.com/privacy
Enter a link to the application's privacy policy.
Example: https://example.com/terms
Enter a link to the application's terms of use.
Once all fields are completed, click the Continue button to proceed to the next step.
Step 3: Security Scheme
In this step, provide the following required information to define how your application will securely interact with our APIs:
- Client App Security Type
- Application Type
- System-to-System Apps - Designed for server-to-server communication.
- Server-based Web Apps - Applications that run on your server with backend logic.
- SPA Apps - Single-page applications that run entirely in the browser.
- Client Credentials Flow Method
- Client Secret - Uses a shared secret string between your app and the authorization server. Simpler to set up, but the secret must be stored and rotated securely.
- Client Assertion - Public/Private Key Pair - Uses a signed JWT created with your private key and validated with your public key. Stronger security and recommended for enterprise use and key-rotation scenarios.
- Response Type
Example: OAuth 2.0
Select the authentication method your application will use. We recommend OAuth 2.0
for most applications, as it offers enterprise-grade security and is the standard
protocol supported by our platform.
If you select OAuth 2.0, additional fields such as Application Type and Response
Type will appear.
Alternatively, you may choose API Key authentication.
Note: API Key authentication is limited to a small set of low-risk APIs and requires explicit approval. Due to the manual approval process, API Key requests may take longer to process.
Example: Server-based Web App
Choose the type of application you are building:
Example: Client Secret
Choose how your System-to-System App authenticates in the client credentials flow:
Example: code
This field will appear based on your selected authentication method.
Once all fields are completed, click the Continue button to proceed to the next step.
Step 4: Support Contact Information
In this step, provide the following contact details to ensure proper communication and support:
- Support Distribution Email
- US Support Contact Phone Number
Example: support@example.com
Enter the email address that will receive notifications and important updates related to your application. Additionally, this email will be used to communicate credential and certification expiration/renewal notices.
Example: +1 (800) 555-1234
Provide a U.S.-based phone number where our support team can reach the primary contact for your application.
Once all fields are completed, click the Continue button to proceed.
Step 5: Review and Submit
Carefully review all the information you've entered throughout the registration process.
- To make changes, use the Back button.
- If everything is accurate, click Submit to complete the registration.
Step 6: Confirmation
After submission, a confirmation message will appear indicating that your application registration is complete.
If an error occurs, please contact Customer Support for assistance.
Post-Approval Access
Once your application is approved for the specified API(s), it will be available for testing and development.
- External Developers will have access to the Sandbox environment.
- Internal Developers will see all available environments, including deva, sita, uat, pit, and prod.
Important:
After successfully creating an application, users must add the required APIs by
navigating to Manage APIs.
Creating an application alone is not
sufficient—APIs must be explicitly added to enable functionality.
View Application
After successfully creating an application, users will see several options under Action Items.
On the View Application page, users can:
- View the application details along with the associated APIs.
- Access the Promote Application button, located at the bottom of the page.
If the user wishes to promote the application to a higher environment, they can do so from this page.
- If the application has not yet been promoted to the target environment, both the application and its associated APIs will be deployed.
- If the application is already promoted, only the APIs will be deployed.
Edit Application
After registration, users can update specific fields using the Edit Application option. This allows for modifications to selected values without needing to recreate the application.
Manage Credentials
This page allows users to manage their credentials.
When renewing credentials, always ensure your applications are using the alternate key before proceeding to avoid service interruption. Renew keys regularly and immediately if compromised.
Primary Credential
- Primary Subscription Key
- Client ID
- Primary Client Secret (when Client Secret is selected)
- Public Certificate (when Client Assertion JWT is selected)
- Expiring On
- Scope
Example: sub-key-abc123xyz
Users can toggle the visibility of the Primary Subscription Key using the eye icon in the field. A Renew button is available on the right side, allowing users to renew the key.
Example: client-id-987654321
Users can toggle the visibility of the Client ID using the eye icon in the field.
Example: secret-key-xyz987abc
Users can toggle the visibility of the Primary Client Secret using the eye icon in the field. A Renew button is available on the right side, allowing users to renew the secret.
Example: -----BEGIN CERTIFICATE----- MIIC... -----END CERTIFICATE-----
A Public Certificate textarea is displayed for JWT-based authentication. Users can view or update the certificate used to validate the signed client assertion.
Example: 2025-12-31
Displays the expiration date of the Primary Client Secret or Public Certificate, based on the selected Client Credentials Flow Method.
Example: scope value
Displays the scope value associated with the credentials.
Secondary Credential
- Secondary Subscription Key
- Client ID
- Secondary Client Secret (when Client Secret is selected)
- Public Certificate (when Client Assertion JWT is selected)
- Expiring On
- Scope
Example: sub-key-abc123xyz
Users can toggle the visibility of the Primary Subscription Key using the eye icon in the field. A Renew button is available on the right side, allowing users to renew the key.
Example: client-id-987654321
Users can toggle the visibility of the Client ID using the eye icon in the field.
Example: secret-key-xyz987abc
Users can toggle the visibility of the Secondary Client Secret using the eye icon in the field. A Renew button is available on the right side, allowing users to renew the secret.
Example: -----BEGIN CERTIFICATE----- MIIC... -----END CERTIFICATE-----
A Public Certificate textarea is displayed for JWT-based authentication. Users can view or update the certificate used to validate the signed client assertion.
Example: 2025-12-31
Displays the expiration date of the Secondary Client Secret or Public Certificate, based on the selected Client Credentials Flow Method.
Example: scope value
Displays the scope value associated with the credentials.
Mark Credential as Currently in Use
Under Manage Credentials, select the Mark as currently in use checkbox for the credential set your application is using on the client side: primary or secondary. This helps you track credential usage and lets the CareFirst platform team know which set your application is using.
This checkbox is informational only. It does not change the credentials your application uses, affect authentication, or impact runtime behavior.
Manage API(s)
This page allows users to view and manage all available APIs.
At the bottom of the page, users will find an Add/Remove API(s) button. Clicking this button redirects the user to another page where they can add or remove APIs for a specific application.
On the redirected page, users can utilize filter options such as Filter By and API Type to narrow down the list of APIs based on their preferences.
- Filter By
- API Type
Example: API Name, Environment, Status
Example: FHIR, REST, GraphQL
Application Approval Process
To get your application approved, you need to submit a request through the Contact Us form with the subject "Application Approval Request."
Invoking APIs Using Authorization Code Grant Type
Once your application has been registered and approved in the sandbox and you have received valid credentials, you can utilize the Authorization Code grant type to access the APIs through your application or tools such as Postman. It's important to conduct comprehensive testing in the sandbox environment before promoting your application to production.
The Authorization URL ({{authorization_url}}) and Token URL
({{token_url}}) for your environment are listed under
OAuth Authorization Code Endpoints
in Base URL. Replace {{LOB}} in both URLs with
your application's line-of-business code: CHPDC, CHPMD,
DSNP, MAPD, MHBE, or EGWP,
as applicable to your approved API access. Find sandbox test credentials in the
Sandbox Test Credentials section.
Getting an Authorization Code
Use {{authorization_url}} for your environment from
Base URL > OAuth Authorization Code Endpoints with your
LOB code substituted. Append the query parameters below, URL-encoding their values.
This IDP endpoint is separate from {{baseurl}}, the API host.
{{authorization_url}}?aud={audience}&redirect_uri={redirect_uri}&state={state}&scope={scope}&client_id={client_id}&response_type=code
Set the query parameters using your registered application's configuration:
client_id: your application client ID.redirect_uri: your application's registered redirect URI. Use the same value when requesting the access token.scope: the authorization-code scopes assigned to your registered application.state: a unique value for this authorization request; verify the returned value matches.aud: the authorization audience configured for your registered application.response_type:code.
On a successful call, you should have the authorization code in your redirect URI.
Getting an Access Token
After receiving the application credentials and the authorization code, send a POST request against the Access Token endpoint using the URL, headers, and body content below.
URL
POST to {{token_url}} from
Base URL > OAuth Authorization Code Endpoints, using the
same environment and LOB as the authorization request. Keep the full IDP token path,
including its trailing slash.
Headers
| content-type | application/json |
| accept | application/json |
| authorization | Basic base64(client_id:client_secret) |
For the Basic header, Base64-encode the complete client_id:client_secret
string, then prefix the encoded value with Basic .
Body
| code | {oauth code} |
| grant_type | "authorization_code" |
| redirect_uri | {your_redirect_uri} |
Token Caching Recommendation
To reduce latency and avoid unnecessary token requests, cache the access token on the client application side and reuse it until it expires. Request a new token only when the current token has expired (or is about to expire).
- Do not request a new token for every API call.
- Track the token expiration from the token response and refresh only when required.
- Use a small refresh buffer (for example, 1-2 minutes) to avoid edge-case expiration during in-flight requests.
Using an Access Token to Call the Patient API
Replace {{baseurl}} with the API host only (scheme and hostname, without
an API path or trailing slash) for your approved Patient Access API environment and line
of business. Replace {patient_id} with the patient ID and
{{Access Token}} with the access token returned by the token request.
The Patient Access API base URL for each environment and line of business is listed in
Base URL.
Sample Request
curl --location --request GET '{{baseurl}}/extfhirpatientaccess/v1/Patient/{patient_id}' \
--header 'Authorization: Bearer {{Access Token}}'
{
"resourceType": "Patient",
"id": "62f4fdda-3bf5-3de1-9a27-cc6b64c75fb8",
"meta": {
"versionId": "1",
"lastUpdated": "2021-11-03T11:35:51.384+00:00",
"profile": [
"http://hl7.org/fhir/us/carin-bb/StructureDefinition/C4BB-Patient",
"http://hl7.org/fhir/us/carin-bb/StructureDefinition/C4BB-Patient|1.1.0"
]
},
"extension": [
{
"url": "https://carefirst.com/internal/last_updated_date",
"valueId": "2021-11-01"
},
{
"url": "https://carefirst.com/internal/row_id",
"valueId": "488024"
},
{
"url": "https://carefirst.com/internal/source_id",
"valueId": "MEDCAIDDC"
}
],
"identifier": [
{
"type":
{
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/v2-0203",
"code": "MB"
}
]
},
"system": "https://carefirst.com/internal/CF_MEMBER_LIFE_ID",
"value": "15675098"
},
{
"system": "https://carefirst.com/internal/lob",
"value": "CHPDC"
},
{
"system": "https://carefirst.com/internal/group",
"value": "1000"
},
{
"system": "https://carefirst.com/internal/plan",
"value": "DCM"
}
],
"name": [
{
"family": "Jaschuh",
"given":
"Wn"
]
}
],
"gender": "male",
"birthDate": "1961-00-00",
"address":
[
{
"city": "WASHINGTON",
"state": "DC",
"postalCode": "20019",
"period":
{
"start": "2021-10-28",
"end": "9999-12-31"
}
}
]
}
Invoking APIs Using Client Credentials Grant Type
Once your application has been registered and approved in the sandbox and you have received valid credentials, you can utilize the Client Credentials grant type to access the APIs through your application or tools such as Postman. It's important to conduct comprehensive testing in the sandbox environment before promoting your application to production.
Getting an Access Token with Secret
Once you have received the application credentials, please proceed to send an HTTP POST request to the access token endpoint. Ensure that you include the specified parameters in the HTTP body.
Configuration
For external applications, use the Token URL as {{token_url}} and the
Client Secret Scope as {scope} for your environment, both listed in the
External Developers table under Non-Interoperable APIs.
Internal developers can use the
internal developer URL mapping
and their application's assigned credentials.
POST to {{token_url}}, not the API host {{baseurl}}.
Use credentials for the same environment. Confirm the current scope on your application's credentials page.
Headers
| content-type | application/x-www-form-urlencoded |
| x-api-subscription-key | {your_subscription_key} |
Body
| client_id | {your_client_id} |
| grant_type | "client_credentials" |
| client_secret | {your_client_secret} |
| scope | {scope} (Client Secret Scope for your environment in the External Developers table) |
Token Caching Recommendation
Cache the access token on the client application side and reuse it until expiration. Generate a new token only after expiry (or shortly before expiry).
- Avoid calling the token endpoint for every request.
- Store token expiry and refresh only when needed.
- Apply a short refresh buffer (for example, 1-2 minutes) to prevent token expiry during API execution.
Getting an Access Token with JWT Assertion
Once you have received the application credentials, complete the following steps.
Configuration
For external applications, use the Token URL as {{token_url}}, the JWT Assertion Scope as
{scope}, and the JWT Assertion Audience as the aud claim for your environment, all listed in the
External Developers table under Non-Interoperable APIs.
Use credentials for the same environment. Confirm the current scope on your application's credentials page.
Step 1: Generate a JWT using claims and a private key
Use the claims below and your private key to generate the JWT. The corresponding public certificate should be shared and installed in CareFirst.
| Claim | Value |
|---|---|
| iss | {your_client_id} |
| sub | {your_client_id} |
| aud | {JWT Assertion Audience from the External Developers table} |
| iat | {The time of creation of the JWT} |
| exp | {The time when the JWT validity should expire} |
| jti | {System-generated unique identifier for the JWT} |
| extensions | {A JSON object claim to provide required business information} |
Step 2: Request an access token
Once the JWT is generated, send an HTTP POST request to the access token endpoint. Ensure the specified parameters are included in the HTTP body.
POST to {{token_url}} from the External Developers table and use the matching scope.
The aud value in Step 1 is distinct from both the CareFirst Token URL and the API host;
do not use {{token_url}} or {{baseurl}} as the JWT audience.
Headers
| content-type | application/x-www-form-urlencoded |
| x-api-subscription-key | {your_subscription_key} |
Body
| client_assertion_type | urn:ietf:params:oauth:client-assertion-type:jwt-bearer |
| client_assertion | {The same JWT generated in Step 1} |
| grant_type | client_credentials |
| scope | {scope} (JWT Assertion Scope for your environment in the External Developers table) |
Token Caching Recommendation
Cache the access token on the client application side and reuse it until expiration. Request a new token only when the current token has expired (or is close to expiry).
- Do not request a new access token for every API call.
- Use the token expiry returned by the token service to control refresh timing.
- Use a short safety buffer (for example, 1-2 minutes) before expiry for proactive refresh.
Sign in to your account.
Get the Application Ready for Production
Before moving to production, ensure your application has been thoroughly tested in the sandbox environment with all required APIs and functionality.
Once testing is complete, you can promote your application to production by following the steps outlined in the Promote application to production section.
After successful promotion and CareFirst approval, you can begin calling CareFirst APIs in the production environment using your production credentials.
Important: Production APIs handle live data and require proper approval before access is granted. Make sure your application meets all security and compliance requirements.
CMS Interop API Availability
CareFirst BlueCross BlueShield makes a set of HL7® FHIR®-based APIs available on the API Marketplace to support compliance with two CMS final rules:
- CMS-9115-F (CMS Interoperability and Patient Access final rule, 2020) introduced the Patient Access API, Provider Directory API, and Payer-to-Payer API.
- CMS-0057-F (CMS Interoperability and Prior Authorization final rule, finalized January 2024) adds the Provider Access API and Prior Authorization API, and expands the Patient Access and Payer-to-Payer APIs to include certain prior authorization information.
Compliance dates vary by API and payer type. Operational provisions (such as prior authorization decision timeframes and public metric reporting) generally began January 1, 2026; API build-out requirements generally take effect January 1, 2027. Developers should confirm specific compliance dates for the line of business they are integrating with against the authoritative CMS-0057-F final rule.
API Availability Matrix
| Line of Business | Code | Plan(s) | Patient Access API | Provider Directory API | Payer-to-Payer API | Provider Access API | Prior Authorization API |
|---|---|---|---|---|---|---|---|
| Medicare Advantage | MAPD | CareFirst BlueCross BlueShield Medicare Advantage | Yes | Yes | Yes | Yes | Yes |
| Medicare Advantage | DSNP | CareFirst BlueCross BlueShield Medicare Advantage Dual Prime | Yes | Yes | Yes | Yes | Yes |
| Medicare Advantage | EGWP | Employer Group Waiver Plan | Yes | Yes | Yes | Yes | Yes |
| Medicaid & Community Health | CHPMD | CareFirst BlueCross BlueShield Community Health Plan Maryland | Yes | Yes | Yes | Yes | Yes |
| Medicaid & Community Health | CHPDC | CareFirst BlueCross BlueShield Community Health Plan DC | NA | NA | Yes** | NA | NA |
| Exchange | MHBE | MHBE Individual Plans | Yes* | NA | Yes* | Yes | Yes |
| Exchange | MHBE | MHBE Small Group Plans | NA | NA | NA | Yes | Yes |
Legend
- Yes — The API is available for this line of business / plan.
- NA — The API is not applicable, or not in scope, for this line of business / plan.
Footnotes
*— Availability is limited to CMS-9115-F mandate requirements only; the CMS-0057-F enhancements (e.g., expanded prior authorization data) do not apply to this plan.**— For former CHPDC (DC Medicaid) members, data — including clinical data — remains available through the Payer-to-Payer API until September 30, 2029.
Who Can Access These APIs
- The Patient Access API and Payer-to-Payer API require member (or personal representative) authorization and are intended for authorized third-party applications and payer organizations, respectively.
- The Provider Directory API is publicly accessible and does not require member authorization.
- The Provider Access API is intended for contracted CareFirst providers, health systems, EHR vendors, and other authorized healthcare technology partners.
- The Prior Authorization API supports electronic prior authorization workflows for contracted providers and their technology partners.
Application approval, registration, and credentialing follow the standard API Marketplace developer workflow. To get started, see Register as a Developer, Register Your Application, and Invoking APIs Using Authorization Code Grant Type. API base URLs, endpoints, and paths are listed in Base URL under Additional Information.
Related Information
- API Marketplace FAQs
- BCBSA Interoperability Mandate (IPP 1.03) API Availability page — for Provider Access and Prior Authorization availability across additional CareFirst lines of business not covered by the CMS mandate
BCBSA IPP API Availability
In addition to the federal CMS interoperability mandates, CareFirst participates in the Blue Cross Blue Shield Association's Inter-Plan Programs (IPP) framework, which governs how Blue plans exchange data for members who receive care outside their home plan's service area (BlueCard members). Published, publicly available detail specific to "IPP Policy 1.03" was not available during the drafting of this page; the summary below reflects general, publicly reported information about the related BCBSA Interoperability Hub initiative and should be confirmed against the authoritative BCBSA policy source before publication.
Based on publicly available third-party reporting (not an official BCBSA policy document), the BCBSA Interoperability Hub is described as a shared platform that lets Home and Host Blue plans securely exchange member and prior authorization data for BlueCard members using FHIR-based standards. Reported timelines indicate Blue plans were expected to connect to the Hub by March 31, 2026, and to support data exchange across all lines of business by January 1, 2027. These details are third-party reported and must be confirmed against CareFirst's internal compliance source before publication.
Under this mandate, CareFirst makes the Provider Access API and Prior Authorization API available across a broader set of lines of business than the CMS mandate covers — including commercial, Federal Employee Program (FEP), and additional exchange lines of business. The Patient Access, Provider Directory, and Payer-to-Payer APIs are not part of this mandate; their availability is governed separately under the CMS Interoperability mandate (see the related CMS Interoperability API Availability page).
API Availability Matrix
| Line of Business | Code | Plan(s) | Provider Access API | Prior Authorization API |
|---|---|---|---|---|
| Medicare Advantage | MAPD | CareFirst BlueCross BlueShield Medicare Advantage | Yes | Yes |
| Medicare Advantage | DSNP | CareFirst BlueCross BlueShield Medicare Advantage Dual Prime | Yes | Yes |
| Medicare Advantage | EGWP | Employer Group Waiver Plan | Yes | Yes |
| Medicaid & Community Health | CHPMD | CareFirst BlueCross BlueShield Community Health Plan Maryland | Yes | Yes |
| Exchange | MHBE | MHBE Individual Plans | Yes | Yes |
| Exchange | MHBE | MHBE Small Group Plans | Yes | Yes |
| Exchange | VAHBE | Virginia ACA Individual Marketplace | Yes | Yes |
| Exchange | VAHBE | Virginia ACA Small Group Plan | Yes | Yes |
| Exchange | DCHBX | DC Health Link Individual | Yes | Yes |
| Exchange | DCHBX | DC Health Link Small Business Marketplace | Yes | Yes |
| Commercial | THDC | DC Basic Health Plan | Yes | Yes |
| Commercial | LGP | Fully Insured Large Group / 51+ Risk | Yes | Yes |
| Commercial | SMG | Small Group Fully Insured | Yes | Yes |
| Commercial | IDL | Individual Marketplace Plans | Yes | Yes |
| Commercial | ASO | Self-Funded / Administrative Services Only | Yes | Yes |
| FEHBP | FEP HMO | FEP BlueChoice HMO | Yes | Yes |
| FEHBP | FEP PPO | FEP PPO | NA | Yes |
| CFA* | CFA | CFA | Yes | Yes |
Legend
- Yes — The API is available for this line of business / plan.
- NA — The API is not applicable, or not in scope, for this line of business / plan.
Footnotes
*— CFA is not in scope for the January 1, 2027 go-live.
To get started, see Register as a Developer, Register Your Application, and Invoking APIs Using Authorization Code Grant Type. API base URLs, endpoints, and paths are listed in Base URL under Additional Information.
Related Information
- CMS Interoperability Mandate (CMS-9115-F & CMS-0057-F) API Availability page — for Patient Access, Provider Directory, and Payer-to-Payer API availability
- API Marketplace FAQs
Prior Authorization Coverage Requirements Discovery (CRD) API
1. Overview
The CareFirst Coverage Requirements Discovery (CRD) API is a synchronous CDS Hooks service that enables an Electronic Health Record (EHR) or authorized third-party application to discover coverage and prior authorization requirements at the point of care. The API uses FHIR R4 resources supplied in CDS Hooks context and prefetch data and follows the CareFirst implementation of the Da Vinci CRD workflow.
The business objective is to provide timely guidance before a service is delivered by answering the following questions:
- Is the requested service covered for the identified member?
- Is prior authorization required?
- Is additional documentation required?
- Is there an instruction, external reference, or system action that the provider should apply?
- Should the request be processed by CareFirst or routed through an applicable inter-plan workflow?
The API validates the hook request and included FHIR resources, resolves the member from Coverage, performs applicable plan routing and rules evaluation, and returns CDS Hooks cards and/or system actions.
A CRD response provides coverage and utilization-management guidance. It is not a prior authorization approval and is not a guarantee of payment. When prior authorization is required, the consumer must continue the applicable documentation and authorization workflow.
2. API Profile
| Attribute | Value |
|---|---|
| API | CareFirst Prior Authorization Coverage Requirements Discovery (CRD) |
| Business objective | Provide real-time coverage and prior authorization requirement discovery within the provider workflow. |
| API style | REST/JSON using CDS Hooks |
| FHIR version | FHIR R4 (4.0.1) resources in context and prefetch |
| Processing | Synchronous |
| Primary operation | POST /cds-services/{service-id} |
| Service discovery | GET /cds-services, when enabled by the environment contract |
| Availability | GET /status, when enabled by the environment contract |
| Authentication | OAuth 2.0 Client Credentials using CareFirst-issued credentials and scopes |
| Request media type | application/json |
| Response media type | application/json; application/fhir+json for OperationOutcome when applicable |
| Supported order resources | ServiceRequest and DeviceRequest |
| Transport | HTTPS using CareFirst-approved TLS configuration |
Hook classification
| Hook | Classification | Consumer expectation |
|---|---|---|
appointment-book with an associated order | Supported | Include the appointment, order, and fixed prefetch resources. |
order-select | Supported | Include selected draft orders and fixed prefetch resources. |
order-sign | Supported | Include orders being signed and fixed prefetch resources. |
order-dispatch | Supported | Include dispatched order references and fixed prefetch resources. |
encounter-start | Recognized but not evaluated | Supply the fixed prefetch resources. The current implementation may return an informational card without a system action. |
encounter-discharge | Recognized but not evaluated | Supply the fixed prefetch resources. The current implementation may return an informational card without a system action. |
appointment-book without an order | Recognized but not evaluated | The API returns informational guidance because no qualifying order is available. |
| Any other hook | Unrecognized | The request is rejected according to the published error contract. |
3 Prerequisites
Before calling the API, a third-party consumer must complete the following prerequisites.
- Application onboarding
- Register the organization and application through the CareFirst API onboarding process.
- Obtain CRD product entitlement for each required environment.
- Complete applicable security, privacy, legal, and connectivity reviews.
- Authentication and connectivity
- Obtain the OAuth client identifier, client secret or approved equivalent, token endpoint, API access key, and assigned scopes.
- Configure HTTPS and CareFirst-approved TLS settings.
- Store credentials securely. Do not place credentials in source code, URLs, logs, or user-visible messages.
- Use environment-specific URLs and credentials.
- CDS Hooks implementation and fixed CareFirst CRD prefetch contract
- Generate a unique UUID for every
hookInstance. - Select the CareFirst-published CRD service identifier and call
POST /cds-services/{service-id}. - Construct the hook-specific
contextrequired by the applicable CDS Hooks specification. - Implement the fixed CareFirst CRD prefetch contract. Providers must include the required FHIR resources listed below with each applicable hook invocation. Only resource names are listed here; prefetch queries remain defined by the CareFirst service contract.
appointment-book: Patient, Encounter, Coverage, ServiceRequest, PractitionerRole, Practitioner, Organization, Location.encounter-start: Patient, Encounter, Coverage, PractitionerRole, Practitioner, Organization, Location.encounter-discharge: Patient, Encounter, Coverage, PractitionerRole, Practitioner, Organization, Location.order-dispatch: Patient, Encounter, Coverage, CommunicationRequest, DeviceRequest, MedicationRequest, NutritionOrder, ServiceRequest, VisionPrescription, Device, Medication, PractitionerRole, Practitioner, Organization, Location.order-select: Patient, Encounter, Coverage, Device, Medication, PractitionerRole, Practitioner, Organization, Location.order-sign: Patient, Encounter, Coverage, Device, Medication, PractitionerRole, Practitioner, Organization, Location.
- Provider systems are responsible for populating and sending the required prefetch resources. CareFirst does not currently support payer-initiated queries that retrieve these resources directly from the provider EHR.
- Preserve valid references among Patient, Coverage, Encounter, orders, practitioners, organizations, locations, devices, and medications.
- Use the exact prefetch keys and queries published in the CareFirst service contract. Resource names in this document do not replace the executable service definition.
- Generate a unique UUID for every
- Member and Coverage data
- Include an active Coverage resource.
- Populate
Coverage.subscriberIdwhenever available. - If
Coverage.subscriberIdis unavailable, include a Coverage identifier with type codeMBand the member identifier as its value. - Ensure that Coverage beneficiary/subject references are consistent with the Patient in the request.
- Clinical and order data
- Use ServiceRequest or DeviceRequest for full CRD order evaluation.
- Include the orders applicable to the current hook invocation.
- Use CareFirst-supported CPT, HCPCS, revenue, and ICD-10 coding as applicable.
- Include requesting and servicing practitioner data and related organizations and locations when required.
- When multiple diagnoses are supplied, identify the principal diagnosis consistently with the CareFirst contract.
- Operations and security
- Supply required correlation headers, such as
x-clientrefid,x-correlationid, andx-cf-guid, when specified by the environment contract. - Do not include PHI in URLs, correlation identifiers, telemetry, or unapproved logs.
- Implement timeout handling, safe retry controls, monitoring, and audit logging.
- Validate the request locally before sending it.
- Supply required correlation headers, such as
Illustrative request
{
"hook": "order-sign",
"hookInstance": "8aff3f80-5b16-4ec5-b5a0-fb61e3c87b21",
"context": {
"userId": "PractitionerRole/123",
"patientId": "Patient/456",
"encounterId": "Encounter/789",
"draftOrders": {
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "ServiceRequest",
"id": "sr-1001",
"status": "draft",
"intent": "order",
"subject": { "reference": "Patient/456" }
}
}
]
}
},
"prefetch": {
"patient": { "resourceType": "Patient", "id": "456" },
"encounter": { "resourceType": "Encounter", "id": "789", "status": "in-progress" },
"coverage": {
"resourceType": "Coverage",
"id": "cov-1",
"status": "active",
"subscriberId": "ABC123456789",
"beneficiary": { "reference": "Patient/456" }
}
}
}
This sample is abbreviated. It does not show every prefetch resource required for order-sign. Consumers must send all resources required by the fixed CareFirst prefetch contract and use the exact published prefetch property names.
4 Supported Capabilities
- Invoke CRD through
POST /cds-services/{service-id}. - Discover CDS service definitions through
GET /cds-services, when enabled. - Check service availability through
GET /status, when enabled. - Classify supported, recognized-but-not-evaluated, and unrecognized hooks.
- Evaluate qualifying ServiceRequest and DeviceRequest resources.
- Resolve the member from
Coverage.subscriberId, with fallback to a Coverage identifier with type codeMB. - Determine coverage and whether prior authorization is required.
- Indicate when additional documentation is required, when available from the applicable rules response.
- Return CDS Hooks cards with summary, detail, indicator, source, and links when applicable.
- Return supported system actions containing coverage-information data for eligible requests.
- Route applicable inter-plan requests according to CareFirst plan-routing rules.
- Support transaction tracing with approved correlation identifiers.
HTTP invocation
POST /cds-services/{service-id} HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
x-clientrefid: {caller-reference}
x-correlationid: {correlation-id}
Content-Type: application/json
Accept: application/json
Illustrative response
{
"cards": [
{
"uuid": "2e3eb24d-b59d-458f-b634-d3627b57a17f",
"summary": "Coverage requirements are available",
"detail": "Review the coverage and prior authorization information for the requested service.",
"indicator": "info",
"source": {
"label": "CareFirst Coverage Requirements Discovery"
}
}
],
"systemActions": []
}
The exact card, extension, and system-action structure is defined by the release-specific CareFirst contract. An HTTP 200 response is not an authorization approval.
5 Limitations
- Full order evaluation is limited to supported ServiceRequest and DeviceRequest workflows.
- Recognized hooks that are not evaluated may return informational cards without system actions.
- Provider systems must supply the complete fixed prefetch data. CareFirst does not currently query the provider EHR to retrieve missing prefetch resources.
- Unsupported procedure or diagnosis coding systems may produce an unprocessable-request response.
- Missing required clinical, member, practitioner, or servicing information may prevent evaluation.
- A CRD result reflects information available at the time of the request. Coverage, eligibility, benefits, and rules may subsequently change.
- A covered result does not guarantee payment.
- A prior-authorization-not-required result does not replace eligibility, medical necessity, benefit, or claims requirements.
- A prior-authorization-required result does not create or submit an authorization request.
- Inter-plan processing depends on the availability of applicable external routing services.
- Endpoint URLs, scopes, request-size limits, rate limits, retry intervals, and service levels are environment and release specific.
- Consumers must not expose internal routing details, backend error codes, credentials, or sensitive member information to end users.
6 Typical Interaction
- A provider starts a supported clinical workflow.
- The EHR selects the applicable CareFirst CRD service.
- The EHR constructs the hook-specific context.
- The provider system collects and populates every resource required by the fixed prefetch contract for that hook.
- The EHR sends an authenticated request with a unique
hookInstanceand required correlation identifiers. - CareFirst validates authentication, JSON syntax, hook data, prefetch completeness, FHIR resources, references, and coding.
- CareFirst resolves the member from Coverage.
- CareFirst applies applicable plan-routing logic.
- For an eligible request, CareFirst evaluates coverage and prior authorization rules.
- CareFirst returns CDS Hooks cards and/or system actions.
- The EHR displays the guidance and applies supported actions within the provider workflow.
- If further documentation or prior authorization is required, the provider continues the appropriate downstream workflow.
Provider workflow
-> Build hook context
-> Populate fixed CareFirst prefetch resources
-> Authenticate and invoke CRD
-> Validate hook, FHIR data, and references
-> Resolve member and plan routing
-> Evaluate coverage and PA requirements
-> Return CDS Hooks cards/system actions
-> Display guidance in the EHR
Consumers must evaluate the HTTP status, cards, and system actions separately. They must not interpret HTTP 200 alone as a positive coverage or authorization result.
7 Core Schema Elements
| Element | Type | Direction | Description |
|---|---|---|---|
hook | string | Request | Clinical workflow event, such as order-sign. |
hookInstance | UUID | Request | Unique identifier for the individual invocation. |
context | object | Request | Hook-specific patient, user, encounter, appointment, selection, and order context. |
prefetch | object | Request | Fixed set of FHIR resources supplied by the provider according to the CareFirst contract. |
| Patient | FHIR resource | Request | Member/patient associated with the event. |
| Encounter | FHIR resource | Request | Encounter associated with the invoked workflow. |
| Coverage | FHIR resource | Request | Coverage and member-identification data used for evaluation. |
| ServiceRequest | FHIR resource | Request | Request for a clinical service or procedure. |
| DeviceRequest | FHIR resource | Request | Request for a medical device. |
| PractitionerRole | FHIR resource | Request | Practitioner role, organization, and location context. |
| Practitioner | FHIR resource | Request | Requesting or servicing practitioner data. |
| Organization | FHIR resource | Request | Provider or facility organization data. |
| Location | FHIR resource | Request | Service or workflow location data. |
cards | array | Response | User-facing decision-support guidance. |
cards[].summary | string | Response | Concise description of the guidance. |
cards[].detail | string | Response | Additional explanation. |
cards[].indicator | code | Response | Importance indicator permitted by CDS Hooks. |
cards[].source | object | Response | Source of the guidance. |
cards[].links | array | Response | External or application links when supported. |
systemActions | array | Response | EHR actions returned for supported scenarios. |
| OperationOutcome | FHIR resource | Error | Structured diagnostic details when applicable. |
Member identifier resolution
- Use
Coverage.subscriberIdwhen present. - Otherwise, use
Coverage.identifier[type.coding.code="MB"].value. - If the member identifier cannot be resolved, return the applicable informational or error response and stop downstream evaluation.
Prefetch interpretation
- The prefetch list varies by hook and must be implemented exactly as specified in Section 3.
- The presence of a resource type in the list means the provider must support supplying that resource under the fixed contract for the applicable hook.
- The CareFirst service contract defines the actual prefetch keys, FHIR queries, cardinalities, profiles, and handling of empty results.
- References among resources must resolve within the submitted data as required by the contract.
8 Validation and Error Handling
| Scenario | Expected handling |
|---|---|
| Missing, expired, invalid, or incorrectly scoped token | Reject with the applicable 401 or 403 response. |
| Unsupported media type | Reject with 415. |
| Malformed JSON | Reject with 400 before downstream processing. |
Missing or invalid hook or hookInstance | Reject with the applicable client-error response. |
| Unrecognized hook | Reject according to the published CareFirst error contract. |
| Recognized but not evaluated hook | Return informational guidance without a system action, when specified by the implementation. |
| Required prefetch resource missing | Return the applicable validation or informational response and do not assume that CareFirst will retrieve the resource from the EHR. |
| Prefetch resource is malformed or references are inconsistent | Return the applicable 400 or 422 response. |
| Coverage missing | Return the applicable insufficient-information response and do not continue member-based processing. |
| Member identifier cannot be resolved | Return actionable guidance and do not invoke downstream plan or rules processing. |
| Unsupported procedure or diagnosis coding system | Return the applicable unprocessable-request response. |
| Required order, diagnosis, practitioner, or servicing data missing | Return an actionable validation response. |
| Rate limit exceeded | Return 429 when applicable; honor Retry-After. |
| Temporary downstream failure | Return the approved transient-error representation and preserve correlation identifiers. |
| Unexpected server failure | Return a safe 500 or 503 response without internal details or PHI. |
Illustrative OperationOutcome
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "required",
"details": {
"text": "A resource required by the CareFirst CRD prefetch contract is missing."
}
}
]
}
Consumer error-handling requirements
- Log the HTTP status, request timestamp, environment, service identifier,
hookInstance, and approved correlation identifiers. - Do not log access tokens, secrets, full member identifiers, clinical payloads, or PHI unless explicitly permitted by CareFirst controls.
- Do not retry validation failures without correcting the request.
- Retry transient failures only when allowed by the CareFirst contract, using bounded backoff.
- Do not assume CareFirst will retrieve omitted prefetch resources from the provider EHR.
- Do not interpret every HTTP 200 response as a successful coverage determination. Inspect the cards and system actions.
- When the result is unavailable or ambiguous, do not represent the service as authorized or guaranteed to be covered.
Prior Authorization Documentation Templates and Rules (DTR) API
1. Overview
The CareFirst Documentation Templates and Rules (DTR) API enables an Electronic Health Record (EHR), provider application, or other authorized third-party client to retrieve and complete the clinical questionnaires needed to support prior authorization and related documentation workflows.
The API provides three complementary FHIR operations:
Questionnaire/$questionnaire-packageretrieves the applicable questionnaire package and supporting artifacts.Questionnaire/$next-questionadvances an adaptive questionnaire after the provider submits answers.ValueSet/$expandresolves coded answer choices referenced by a questionnaire during an applicable BCBSA adaptive session.Questionnaire/$log-questionnaire-errorsallows an EHR DTR client to report questionnaire, rendering, CQL, terminology, or submission errors associated with a DTR session.
The business objective is to present the correct payer documentation requirements within the provider workflow, reduce manual form discovery, collect structured clinical information, and return consistent FHIR R4 artifacts even when CareFirst must route the request to different downstream systems.
CareFirst acts as the orchestration layer. For a questionnaire-package request, it validates the FHIR request, identifies the member, determines applicable plan routing, resolves the questionnaire vendor, and returns a questionnaire package. For an adaptive questionnaire, it retains session-routing context so subsequent next-question calls can be sent to the correct vendor. When a BCBSA questionnaire references external coded answer options, the expand operation proxies the terminology request to the BCBSA Interoperability Hub. When an EHR reports questionnaire errors, CareFirst uses the Questionnaire canonical URL to resolve the originating session. BCBSA session errors are forwarded to the BCBSA Interoperability Hub, while unresolved and non-BCBSA errors are recorded in the CareFirst audit trail.
The DTR API does not submit a prior authorization request and does not make a final authorization decision. Completing a questionnaire creates documentation that may be used in a later prior authorization workflow.
This document is a consumer-facing integration guide. The published CareFirst API contract, FHIR profiles, environment onboarding material, and operation definitions remain authoritative for base URLs, scopes, headers, canonical URLs, profiles, cardinalities, and release-specific behavior.
2. API Profile
| Attribute | Value |
|---|---|
| API | CareFirst Prior Authorization Documentation Templates and Rules (DTR) |
| Business objective | Retrieve, render, and complete payer-required documentation questionnaires within the provider workflow. |
| API style | REST using FHIR operations and FHIR JSON |
| Implementation alignment | Da Vinci DTR 2.1 |
| FHIR version | FHIR R4 |
| Authentication | OAuth 2.0 Client Credentials using CareFirst-issued credentials and scopes |
| Transport | HTTPS using the CareFirst-approved TLS configuration |
| Primary media type | application/fhir+json |
| Questionnaire package operation | POST /Questionnaire/$questionnaire-package |
| Adaptive continuation operation | POST /Questionnaire/$next-question |
| Terminology expansion operation | GET /{uuid}/ValueSet/$expand |
| Error-reporting operation | POST /Questionnaire/$log-questionnaire-errors |
| Questionnaire package input | FHIR Parameters |
| Next-question input | FHIR QuestionnaireResponse, or the contractually supported Bundle containing one |
| Successful output | FHIR R4 Bundle containing Questionnaire and applicable supporting resources |
| Error representation | FHIR OperationOutcome, subject to operation-specific transport behavior |
| Adaptive session routing | CareFirst-managed cache keyed by questionnaire/session information |
Operation summary
| Operation | When to use it | Main result |
|---|---|---|
$questionnaire-package | Start a DTR questionnaire workflow or retrieve documentation requirements for an order or supported context. | Questionnaire package Bundle. |
$next-question | Continue an adaptive questionnaire after the user answers the current questions. | Bundle containing the next Questionnaire and supporting artifacts, or completion information. |
$expand | Resolve answer choices for a ValueSet referenced by an applicable BCBSA questionnaire. | Expanded FHIR ValueSet or upstream OperationOutcome. |
$log-questionnaire-errors | Report errors encountered while rendering, evaluating, or completing a DTR questionnaire. | HTTP 200 acknowledgement for handled reports, or FHIR OperationOutcome for invalid requests and applicable forwarding failures. |
3 Prerequisites
Before integrating with the DTR API, a third-party consumer must complete the following prerequisites.
- Application onboarding
- Register the organization and application through the CareFirst API onboarding process.
- Obtain DTR product entitlement for each required environment.
- Complete applicable security, privacy, legal, and connectivity reviews.
- Obtain the environment-specific base URL, token endpoint, scopes, API access key, and support contacts.
- Authentication and transport
- Implement OAuth 2.0 Client Credentials using the credentials issued by CareFirst.
- Send the bearer token and any required API access key on every request.
- Use HTTPS and the CareFirst-approved TLS configuration.
- Protect secrets in an approved secret store. Do not place tokens or credentials in URLs, application logs, or user-facing messages.
- FHIR R4 and DTR support
- Send and receive
application/fhir+json. - Support FHIR Parameters, Bundle, Questionnaire, QuestionnaireResponse, Coverage, ServiceRequest, DeviceRequest, Patient, Encounter, Condition, Practitioner, PractitionerRole, Organization, Location, Library, and ValueSet resources as applicable.
- Preserve resource identifiers, canonical references, and references among submitted resources.
- Use the exact CareFirst-published profiles, extensions, value sets, operation definitions, and parameter names.
- Be able to render both standard and adaptive Questionnaires and collect answers in a QuestionnaireResponse.
- Be able to retain the Questionnaire canonical URL and identifier returned by CareFirst and send the correct reference in later calls.
- Send and receive
- Questionnaire-package request preparation
- Construct a FHIR Parameters resource for
POST /Questionnaire/$questionnaire-package. - For an order-based request, include the required
coverageparameter and at least one supportedorderparameter. - Ensure the Coverage and order references resolve to resources included as required by the CareFirst contract.
- Use ServiceRequest or DeviceRequest for supported order-based processing.
- Include applicable referenced clinical context, such as Patient, Encounter, Condition, practitioner, organization, and location information.
- Populate procedure or service codes using CareFirst-supported CPT, HCPCS, or revenue coding.
- Populate diagnosis using supported ICD-10 coding when required.
- Include requesting practitioner, servicing practitioner, and place-of-service information when required for rules evaluation.
- If the CareFirst contract permits a context-based request, include the
contextvalue exactly as issued by the originating workflow. Context-based requests may follow different validation and routing rules from order-based requests.
- Construct a FHIR Parameters resource for
- Member identification
- Include a resolvable Coverage resource for order-based requests.
- Populate
Coverage.subscriberIdwhenever available. - If
Coverage.subscriberIdis unavailable, supply a Coverage identifier with type codeMBand the member identifier as its value. - Ensure Coverage beneficiary and Patient references are consistent.
- Adaptive questionnaire support
- Start the session with
$questionnaire-packagebefore calling$next-question. - Retain the Questionnaire identifier and canonical reference returned in the package.
- Send a QuestionnaireResponse with
statusset toin-progresswhile requesting additional adaptive questions. - Populate
QuestionnaireResponse.questionnairewith the originating Questionnaire canonical reference or identifier required by the CareFirst contract. - Treat the adaptive session as time limited. If session state expires, restart with a new questionnaire-package request.
- Do not change a returned adaptive endpoint, questionnaire identifier, session UUID, or canonical URL.
- Start the session with
- ValueSet expansion support
- Call the terminology URL returned or referenced by the applicable questionnaire package.
- Preserve the UUID path segment exactly as returned for the BCBSA session.
- Send the supported FHIR
$expandquery parameters without changing their meaning. - Use
$expandonly for questionnaires whose terminology endpoint directs the client to this CareFirst proxy. Other vendor questionnaires may provide answer choices inline or use a different terminology mechanism.
- Questionnaire error-reporting support
- Implement
POST /Questionnaire/$log-questionnaire-errorsusing the DTR Log Questionnaire Errors Input Parameters profile:http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-log-errors-input-parameters. - Send exactly one
Questionnaireparameter with the canonical URL of the Questionnaire that generated the error. A version-specific canonical URL should be used when available. - Send exactly one
OperationOutcomeparameter containing a valid FHIR R4 OperationOutcome that describes the questionnaire, CQL, rendering, terminology, or QuestionnaireResponse error. - Use the exact Questionnaire canonical URL returned by
$questionnaire-package. CareFirst uses this value as the session-routing cache key. - Include useful diagnostic context in the OperationOutcome, such as the DTR application identity and version, date and time with timezone offset, provider endpoint, error location, and safe diagnostics.
- Do not include PHI or information retrieved from provider FHIR APIs in the error-reporting OperationOutcome.
- Treat error reporting as best effort. An HTTP 200 acknowledgement indicates that CareFirst handled the report, but does not necessarily mean it was forwarded to a downstream vendor.
- Implement
- Operational readiness
- Generate and propagate the correlation identifiers required by the environment contract.
- Implement safe timeout and retry handling.
- Do not place PHI in URLs, correlation identifiers, telemetry, or unapproved logs.
- Validate FHIR requests locally before sending them.
- Treat a FHIR OperationOutcome as an unsuccessful business result even when an operation-specific implementation returns HTTP 200.
Illustrative questionnaire-package request
{
"resourceType": "Parameters",
"parameter": [
{
"name": "coverage",
"resource": {
"resourceType": "Coverage",
"id": "coverage-1",
"status": "active",
"subscriberId": "ABC123456789",
"beneficiary": {
"reference": "Patient/patient-1"
}
}
},
{
"name": "order",
"resource": {
"resourceType": "ServiceRequest",
"id": "order-1",
"status": "active",
"intent": "order",
"subject": {
"reference": "Patient/patient-1"
},
"code": {
"coding": [
{
"system": "http://www.ama-assn.org/go/cpt",
"code": "00000"
}
]
}
}
},
{
"name": "referenced",
"resource": {
"resourceType": "Patient",
"id": "patient-1"
}
}
]
}
The request is illustrative. Consumers must use valid production codes and the exact Parameters profile and resource packaging rules published by CareFirst.
Illustrative next-question request
{
"resourceType": "QuestionnaireResponse",
"id": "qr-1",
"questionnaire": "https://example.org/fhir/Questionnaire/questionnaire-123",
"status": "in-progress",
"subject": {
"reference": "Patient/patient-1"
},
"item": [
{
"linkId": "1",
"answer": [
{
"valueBoolean": true
}
]
}
]
}
Illustrative log-questionnaire-errors request
{
"resourceType": "Parameters",
"meta": {
"profile": [
"http://hl7.org/fhir/us/davinci-dtr/StructureDefinition/dtr-log-errors-input-parameters"
]
},
"parameter": [
{
"name": "Questionnaire",
"valueCanonical": "https://example.org/fhir/Questionnaire/questionnaire-123|1.0"
},
{
"name": "OperationOutcome",
"resource": {
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "processing",
"details": {
"text": "The DTR client could not render the coded answer control."
},
"expression": [
"Questionnaire.item.where(linkId='coverage-type')"
]
}
]
}
}
]
}
The example deliberately excludes patient and clinical data. The submitted OperationOutcome must not contain PHI or information retrieved from FHIR APIs.
4 Supported Capabilities
Questionnaire package
- Accept a DTR questionnaire-package Parameters request.
- Validate required parameters and resolvable FHIR resources.
- Resolve the member from Coverage.
- Determine HOME, HOST, CFA, and applicable inter-plan routing.
- For eligible CareFirst members, evaluate CareFirst rules to determine coverage, PA requirement, medical-criteria need, and questionnaire vendor.
- Route eligible requests to MCG/HealthEdge, Carelon, EviCore, or the BCBSA Interoperability Hub.
- Return a Questionnaire Package Bundle containing Questionnaire resources and applicable Library, ValueSet, or other supporting resources.
- Consolidate multiple returned questionnaires into a single package when supported.
- Cache adaptive questionnaire routing context for later
$next-questioncalls. - Cache questionnaire canonical URL routing information for applicable questionnaire-error workflows.
Adaptive next question
- Accept a QuestionnaireResponse for an active adaptive questionnaire.
- Validate the resource, questionnaire reference, and
in-progressstatus. - Resolve the vendor and session from CareFirst-managed cache.
- Route the answers to the vendor associated with the originating questionnaire.
- For a BCBSA session, include the cached session UUID in the downstream route.
- Normalize vendor-specific responses into a consistent FHIR R4 questionnaire Bundle.
- Return the next question set or an indication that the adaptive questionnaire is complete.
ValueSet expansion
- Accept
GET /{uuid}/ValueSet/$expandfor an applicable BCBSA terminology session. - Validate that the UUID path segment is present and structurally valid.
- Forward the original expansion query to the BCBSA terminology endpoint.
- Return the expanded ValueSet or upstream error response without changing its clinical meaning.
Log questionnaire errors
- Accept
POST /Questionnaire/$log-questionnaire-errorswith a FHIR Parameters body. - Validate conformance to the DTR Log Questionnaire Errors Input Parameters profile.
- Require one
Questionnairecanonical parameter and one FHIR R4OperationOutcomeparameter. - Use the Questionnaire canonical URL to look up the vendor associated with the session created during
$questionnaire-package. - Forward the original request body without transformation when the cached vendor is BCBSA.
- Record the error in the CareFirst audit table when the session is unknown or expired, Redis is unavailable, or the resolved vendor is MCG, Carelon, or EviCore.
- Return an HTTP 200 acknowledgement for locally handled reports. The acknowledgement does not disclose whether the report was forwarded or only audited.
- Retry a BCBSA 5xx response or timeout up to three times using exponential backoff. If delivery still fails, record the report locally and return HTTP 200 with an OperationOutcome explaining that delivery to the inter-plan hub was unsuccessful.
- Treat audit persistence as non-blocking. If the audit write fails, CareFirst logs the failure and still acknowledges the EHR request.
Illustrative HTTP requests
POST /Questionnaire/$questionnaire-package HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
POST /Questionnaire/$next-question HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
POST /Questionnaire/$log-questionnaire-errors HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
GET /{uuid}/ValueSet/$expand?url={encoded-canonical-url} HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Accept: application/fhir+json
Illustrative questionnaire-package response
{
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "Questionnaire",
"id": "questionnaire-123",
"url": "https://example.org/fhir/Questionnaire/questionnaire-123",
"status": "active",
"subjectType": ["Patient"],
"item": [
{
"linkId": "1",
"text": "Example clinical question",
"type": "boolean"
}
]
}
}
]
}
5 Limitations
- DTR retrieves and completes documentation questionnaires. It does not submit or approve prior authorization.
- Order-based questionnaire-package processing currently supports ServiceRequest and DeviceRequest. Other order resource types may be rejected unless the published contract explicitly supports them.
- Procedure and diagnosis coding is limited to the code systems supported by CareFirst and the selected downstream vendor.
- A questionnaire is returned only when the applicable coverage, PA, medical-criteria, routing, and vendor conditions are satisfied.
- A service identified as not covered, not requiring authorization, or not requiring medical-criteria documentation may not proceed to a questionnaire vendor.
- Multi-order behavior is vendor dependent. Consumers must follow the release-specific CareFirst contract and must be prepared to submit one order at a time if required.
- Carelon request and response details may remain release dependent until the final integration contract is published.
- EviCore may require CareFirst to transform externally referenced resources into contained resources. Consumers should still submit complete, resolvable references according to the CareFirst input contract.
- Adaptive continuation depends on CareFirst cache state. A missing or expired session requires the consumer to restart with
$questionnaire-package. - The
$expandproxy supports the applicable BCBSA terminology route only. It is not a general-purpose terminology service. - Error-report forwarding is currently supported only for BCBSA sessions. MCG, Carelon, and EviCore questionnaire errors are recorded in the CareFirst audit trail but are not forwarded to those vendors.
- Error routing depends on the Questionnaire canonical URL matching the value cached during
$questionnaire-package. An unknown, changed, or expired URL follows the local audit path. - CareFirst validates the structure of the submitted OperationOutcome but does not validate every diagnostic content recommendation. The EHR remains responsible for useful diagnostics and exclusion of PHI.
- A successful acknowledgement does not indicate whether the report was forwarded to BCBSA, stored locally, or encountered a non-blocking audit-write failure.
- CareFirst does not validate a structurally valid
$expandUUID against a local session registry before forwarding. The upstream BCBSA service may reject an unknown session. - Vendor availability and response time can affect all three operations.
- The exact handling of HTTP status versus OperationOutcome differs by scenario. Consumers must inspect both.
- Endpoint URLs, token scopes, cache lifetime, request-size limits, rate limits, retry intervals, and service-level objectives are environment and release specific.
- Consumers must not depend on vendor-specific extensions unless they are explicitly retained in the CareFirst contract.
6 Typical Interaction
Standard questionnaire workflow
- A provider identifies a service for which documentation may be required.
- The EHR creates a FHIR Parameters request containing Coverage, the supported order, and referenced clinical resources.
- The EHR calls
POST /Questionnaire/$questionnaire-package. - CareFirst validates the request and resolves the member.
- CareFirst determines plan routing and the applicable questionnaire vendor.
- CareFirst evaluates coverage, prior authorization, and medical-criteria requirements when applicable.
- CareFirst calls the selected questionnaire source.
- CareFirst returns a FHIR Bundle containing the Questionnaire and supporting artifacts.
- The EHR renders the Questionnaire and records answers in a QuestionnaireResponse.
- The completed documentation is retained for the appropriate downstream prior authorization workflow.
Adaptive questionnaire workflow
- The EHR retrieves a questionnaire package.
- CareFirst stores the questionnaire-to-vendor/session routing context for an adaptive Questionnaire.
- The provider answers the displayed questions.
- The EHR sends the in-progress QuestionnaireResponse to
POST /Questionnaire/$next-question. - CareFirst resolves the session from the Questionnaire reference.
- CareFirst routes the response to the applicable vendor and normalizes the returned artifacts.
- The EHR renders the next questions.
- Steps 3 through 7 repeat until the questionnaire is complete.
- If the session is missing or expired, the EHR restarts the workflow using
$questionnaire-package.
ValueSet expansion workflow
- The EHR renders a BCBSA questionnaire that references an external ValueSet.
- The questionnaire package supplies or references a terminology base URL containing a session UUID.
- The EHR calls
GET /{uuid}/ValueSet/$expandwith the required expansion parameters. - CareFirst validates the request structure and forwards it to the BCBSA terminology service.
- CareFirst returns the expanded ValueSet or the upstream error response.
- The EHR uses the resulting concepts to populate the coded answer control.
Questionnaire error-reporting workflow
- The EHR detects an error while rendering a Questionnaire, resolving a ValueSet, evaluating questionnaire logic, or submitting a QuestionnaireResponse.
- The EHR creates a FHIR Parameters resource containing the original Questionnaire canonical URL and a PHI-free OperationOutcome.
- The EHR calls
POST /Questionnaire/$log-questionnaire-errors. - CareFirst validates the Parameters resource and both required parameters.
- CareFirst uses the Questionnaire canonical URL to look up the cached vendor session.
- If the vendor is BCBSA, CareFirst forwards the original payload to the BCBSA Interoperability Hub.
- If the cache misses, Redis is unavailable, or the vendor is MCG, Carelon, or EviCore, CareFirst records the report in its audit trail without downstream forwarding.
- CareFirst returns the applicable acknowledgement or OperationOutcome.
$questionnaire-package
-> Validate FHIR Parameters
-> Resolve Coverage and member
-> Determine plan and vendor route
-> Retrieve questionnaire package
-> Cache adaptive routing context
-> Return FHIR Bundle
$next-question
-> Validate QuestionnaireResponse
-> Resolve cached session/vendor
-> Forward answers
-> Normalize next-question package
-> Return next questions or completion
$expand
-> Validate UUID and method
-> Forward query to BCBSA terminology service
-> Return expanded ValueSet or upstream error
$log-questionnaire-errors
-> Validate Parameters, Questionnaire canonical, and OperationOutcome
-> Look up vendor by Questionnaire canonical URL
-> BCBSA: forward original report
-> Cache miss or non-BCBSA: write CareFirst audit record
-> Return acknowledgement or applicable OperationOutcome
7 Core Schema Elements
Questionnaire-package request
| Element | Type | Direction | Description |
|---|---|---|---|
| Parameters | FHIR resource | Request | Container for questionnaire-package operation inputs. |
parameter[name="coverage"] | Coverage | Request | Member coverage and payer-plan information. |
parameter[name="order"] | ServiceRequest or DeviceRequest | Request | Service or device order requiring documentation. |
parameter[name="referenced"] | FHIR resource | Request | Additional clinical or administrative context. |
parameter[name="context"] | string | Request | Supported context identifier used by an applicable context-based workflow. |
Coverage.subscriberId | string | Request | Primary member identifier source. |
Coverage.identifier with type MB | Identifier | Request | Fallback member identifier source. |
Questionnaire package and adaptive response
| Element | Type | Direction | Description |
|---|---|---|---|
| Bundle | FHIR resource | Response | Questionnaire package or next-question package. |
| Bundle.type | code | Response | Typically collection for the returned package. |
| Questionnaire | FHIR resource | Response | Questions and rendering metadata. |
Questionnaire.id | id | Response | Session-routing key used by applicable adaptive processing. |
Questionnaire.url | canonical | Response | Stable canonical identifier that the consumer must retain. |
Questionnaire.item | array | Response | Questions, groups, enablement rules, and answer constraints. |
| Library | FHIR resource | Response | Supporting logic when included by the package. |
| ValueSet | FHIR resource | Response | Coded answer options when supplied inline. |
| QuestionnaireResponse | FHIR resource | Request | Provider answers for adaptive continuation. |
QuestionnaireResponse.questionnaire | canonical | Request | Reference to the originating Questionnaire. |
QuestionnaireResponse.status | code | Request | Must be in-progress for adaptive continuation. |
QuestionnaireResponse.item.answer | array | Request | Answers collected from the provider. |
ValueSet expansion
| Element | Type | Direction | Description |
|---|---|---|---|
{uuid} | UUID path segment | Request | BCBSA terminology-session routing identifier. |
url | canonical query parameter | Request | Canonical URL of the ValueSet to expand when required by the operation. |
Additional $expand parameters | Query parameters | Request | Parameters supported by the published terminology contract. |
| ValueSet | FHIR resource | Response | Expanded concepts in ValueSet.expansion. |
| OperationOutcome | FHIR resource | Error | Validation or upstream error details. |
Log questionnaire errors
| Element | Type | Direction | Description |
|---|---|---|---|
| Parameters | FHIR resource | Request | Container conforming to the DTR Log Questionnaire Errors Input Parameters profile. |
parameter[name="Questionnaire"] | canonical | Request | Questionnaire canonical URL used to associate the error with the originating session. Cardinality is 1..1. |
parameter[name="OperationOutcome"] | OperationOutcome | Request | Structured description of the DTR client error. Cardinality is 1..1. |
OperationOutcome.issue | array | Request | Error severity, category, details, diagnostics, location, and expression. Must not contain PHI. |
| HTTP acknowledgement | Empty or contract-defined response | Response | Confirms that CareFirst handled the report. It does not disclose the internal forwarding route. |
| OperationOutcome | FHIR resource | Response | Validation or applicable downstream-delivery diagnostic. |
Consumer interpretation rules
- Retain Questionnaire IDs and canonical URLs exactly as returned.
- Do not invent or replace the BCBSA session UUID.
- Resolve and preserve references in the questionnaire-package request.
- Treat Questionnaire items and enablement logic as authoritative display and answer constraints.
- Preserve answer data types in QuestionnaireResponse.
- A Bundle containing an OperationOutcome is not a successful questionnaire package.
- When a Questionnaire indicates adaptive behavior, use the CareFirst adaptive endpoint supplied by the package or environment contract.
- Use the exact Questionnaire canonical URL in
$log-questionnaire-errors; changing the URL or version can prevent session resolution. - Never include PHI or provider-FHIR-retrieved information in an error-report OperationOutcome.
- Treat the log operation as telemetry and audit reporting, not as a request to resume, correct, or approve the questionnaire workflow.
8 Validation and Error Handling
Common validation
| Scenario | Expected handling |
|---|---|
| Missing, expired, invalid, or incorrectly scoped access token | Reject with the applicable 401 or 403 response. |
| Unsupported media type | Reject with 415. |
| Malformed JSON or invalid FHIR resource | Return the applicable 400 response with OperationOutcome. |
| Missing required correlation or access header | Reject according to the gateway contract. |
| Rate limit exceeded | Return 429 when applicable and honor Retry-After. |
| Unexpected failure | Return a safe 500 or 503 response without credentials, stack traces, internal hostnames, or PHI. |
Questionnaire-package validation
| Scenario | Expected handling |
|---|---|
| Missing Coverage for an order-based request | Return validation OperationOutcome. |
| Missing or invalid order for an order-based request | Return validation OperationOutcome. |
| Coverage reference cannot be resolved | Return the applicable not-found or validation OperationOutcome. |
| Member identifier cannot be resolved | Return an OperationOutcome explaining that the member could not be identified and stop processing. |
| Unsupported member or plan classification | Return the applicable business OperationOutcome. |
| Service is not covered | Return an OperationOutcome and do not call a questionnaire vendor. |
| Authorization is not required | Return an OperationOutcome and do not call a questionnaire vendor. |
| Medical-criteria documentation is not required | Return an OperationOutcome and do not call a questionnaire vendor. |
| Required procedure, diagnosis, practitioner, or place-of-service data is missing | Return an actionable validation OperationOutcome. |
| Unsupported coding system | Return the applicable validation response. |
| Vendor cannot be determined | Return OperationOutcome and stop processing. |
| Context identifier is not found | Return the release-specific not-found OperationOutcome. |
| Downstream 4xx | Do not blindly retry. Return the approved OperationOutcome representation. |
| Downstream 5xx or timeout | Apply CareFirst-managed retry policy; return OperationOutcome if the failure remains. |
Next-question validation
| Scenario | Expected handling |
|---|---|
| Body is absent or is not a supported QuestionnaireResponse payload | Return HTTP 400 with OperationOutcome. |
QuestionnaireResponse.questionnaire is absent | Return HTTP 400 with OperationOutcome. |
QuestionnaireResponse.status is not in-progress | Return HTTP 400 with OperationOutcome. |
| Questionnaire session is missing or expired | Return the release-specific OperationOutcome instructing the client to restart the questionnaire. |
| Cached vendor is unknown | Return OperationOutcome and do not call a downstream vendor. |
| Vendor 4xx | Return the approved vendor-error OperationOutcome or status defined by the release contract. |
| Vendor 5xx or timeout | Apply the release-specific retry and propagation behavior. |
| Questionnaire is complete | Return the standardized completion representation defined by the CareFirst contract. |
ValueSet expansion validation
| Scenario | Expected handling |
|---|---|
| UUID path segment is absent or malformed | Return HTTP 400 with OperationOutcome. |
| HTTP method is not supported | Return HTTP 405. |
| Request represents unsupported inbound BCBSA expansion processing | Return HTTP 400 with OperationOutcome stating that the expand operation is not supported for that direction. |
| BCBSA returns 4xx, including an unknown session or ValueSet | Return the upstream status and FHIR error response according to the proxy contract. |
| BCBSA returns 5xx or times out | Return the release-specific transient-error response. |
Log-questionnaire-errors validation and routing
| Scenario | Expected handling |
|---|---|
| Body is absent or is not a valid FHIR Parameters resource | Return HTTP 400 with OperationOutcome. |
Questionnaire parameter is absent or empty | Return HTTP 400 with OperationOutcome stating that the Questionnaire canonical is required. |
OperationOutcome parameter is absent | Return HTTP 400 with OperationOutcome stating that the parameter is required. |
| Supplied error report is not a valid FHIR R4 OperationOutcome | Return HTTP 400 with OperationOutcome. |
| Questionnaire canonical matches a cached BCBSA session | Forward the original report to BCBSA and acknowledge successful 200 or 204 delivery with HTTP 200. |
| Questionnaire session is missing or expired | Write the report to the CareFirst audit trail and return HTTP 200. |
| Redis is unavailable or times out | Treat as a cache miss, log a warning, write the audit record, and return HTTP 200. |
| Cached vendor is MCG, Carelon, or EviCore | Write the report to the CareFirst audit trail and return HTTP 200 without forwarding. |
| BCBSA returns 4xx | Return the BCBSA error response according to the approved proxy contract and log the result for audit. |
| BCBSA returns 5xx or times out | Retry up to three times with exponential backoff. On exhaustion, record locally and return HTTP 200 with OperationOutcome indicating that delivery failed. |
| CareFirst audit write fails | Log the internal failure and still return HTTP 200 because audit persistence is non-blocking. |
Illustrative OperationOutcome
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "invalid",
"details": {
"text": "QuestionnaireResponse.questionnaire is required."
}
}
]
}
Consumer error-handling requirements
- Inspect both the HTTP status and the FHIR resource type in the response.
- Treat OperationOutcome as an unsuccessful business result unless the CareFirst contract explicitly states otherwise.
- Do not retry structural validation, unsupported-code, member-resolution, or business-rule failures without correcting the request.
- Retry transient failures only when permitted, using bounded backoff and the original correlation context.
- If an adaptive session has expired, restart with
$questionnaire-packagerather than repeatedly calling$next-question. - Do not retry
$expand4xx responses unless the request or session information has been corrected. - Log only approved diagnostic data, such as timestamp, operation name, non-PHI correlation identifiers, HTTP status, and OperationOutcome code.
- Do not log tokens, secrets, entire clinical payloads, or member data without explicit CareFirst authorization.
- Do not retry a successfully acknowledged
$log-questionnaire-errorsrequest merely because the response does not identify the internal route. - Remove PHI before submitting a questionnaire error report.
Prior Authorization Support (PAS) API
1. Overview
The CareFirst Prior Authorization Support (PAS) API enables an Electronic Health Record (EHR), provider application, or authorized trading partner to submit, update, and inquire about prior authorization requests using HL7 FHIR R4 and the Da Vinci PAS 2.1 implementation model.
The PAS API provides two consumer-facing operations:
POST /Claim/$submitcreates a new prior authorization request or updates an existing request.POST /Claim/$inquirysearches for existing authorization decisions and statuses.
The business objective is to provide a standards-based prior authorization channel that validates structured clinical and administrative information, routes requests to the appropriate CareFirst or delegated vendor workflow, returns structured authorization responses, and supports subsequent status inquiries.
For $submit, CareFirst determines whether the request is a create or update, validates the PAS Claim Bundle, resolves the member and plan, evaluates authorization rules, identifies the responsible vendor, and routes the request to EviCore, Carelon, HealthEdge/GuidingCare, or the BCBSA Interoperability Hub as applicable.
For $inquiry, CareFirst validates the search criteria, resolves the member, routes non-CareFirst members to the BCBSA Interoperability Hub, obtains CareFirst authorization records from the Advanced Healthcare Data Store (AHDS), obtains applicable EviCore records, applies provider, service-date, and procedure-code filters, and returns a FHIR searchset Bundle of ClaimResponse resources.
Authorization decisions originating in GuidingCare are persisted asynchronously in AHDS as PAS 2.1 ClaimResponse resources. This supports future inquiry requests and notification workflows. This ingestion process is internal and is not a third-party API operation.
A successful transport response does not always mean that an authorization was approved. Consumers must inspect the returned ClaimResponse outcome, adjudication, decision codes, process notes, and errors. A queued response indicates that processing is pending and does not include a final authorization decision.
This document is a consumer-facing integration guide. The CareFirst-published API contract, FHIR profiles, OpenAPI definition, onboarding materials, and environment-specific specifications remain authoritative for URLs, headers, scopes, cardinalities, code bindings, and release-specific behavior.
2. API Profile
| Attribute | Value |
|---|---|
| API | CareFirst Prior Authorization Support (PAS) |
| Business objective | Submit, update, and inquire about prior authorization requests using standards-based FHIR transactions. |
| API style | REST using FHIR operations and FHIR JSON |
| FHIR version | HL7 FHIR R4 |
| PAS alignment | Da Vinci PAS 2.1 |
| Authentication | OAuth 2.0 Client Credentials using CareFirst-issued credentials and scopes |
| Transport | HTTPS using CareFirst-approved TLS configuration |
| Media type | application/fhir+json |
| Submit operation | POST /Claim/$submit |
| Inquiry operation | POST /Claim/$inquiry |
| Submit request | FHIR Bundle containing a focal Claim and supporting resources |
| Submit response | FHIR Bundle containing ClaimResponse and related resources, or OperationOutcome |
| Inquiry request | FHIR Parameters or the CareFirst-published PAS inquiry request profile |
| Inquiry response | FHIR searchset Bundle containing matching ClaimResponse and provider resources |
| Supported claim types | professional and institutional |
| Processing | Synchronous consumer interaction with internal and vendor orchestration; some decisions may be returned as queued |
Operation summary
| Operation | Purpose | Primary result |
|---|---|---|
$submit create | Submit a new prior authorization request. | PAS ClaimResponse Bundle containing a decision, rejection, or queued acknowledgement. |
$submit update | Modify or cancel a previously created authorization. | Updated PAS ClaimResponse, structured rejection, queued acknowledgement, or OperationOutcome. |
$inquiry | Search for authorization status and decisions. | Searchset Bundle containing matching ClaimResponse resources, or an empty searchset. |
Create versus update
| Condition | Classification |
|---|---|
Claim.related.claim is absent | Create request |
Claim.related.claim references a prior Claim | Update request |
3 Prerequisites
Before integrating with the PAS API, a third-party consumer must complete the following prerequisites.
- Application onboarding
- Register the organization and application through the CareFirst API onboarding process.
- Obtain PAS entitlement for every required environment.
- Complete required security, privacy, legal, interoperability, and connectivity reviews.
- Obtain the environment-specific base URL, OAuth token endpoint, API key, scopes, support contacts, and applicable BCBSA inter-plan requirements.
- Authentication and transport
- Implement OAuth 2.0 Client Credentials using CareFirst-issued credentials.
- Send the bearer token and required API access headers with every request.
- Use HTTPS and the CareFirst-approved TLS configuration.
- Store secrets in an approved secret store. Do not place credentials or tokens in source code, URLs, application telemetry, or user-facing messages.
- FHIR and PAS conformance
- Send and receive
application/fhir+json. - Build requests using FHIR R4 and the CareFirst-supported Da Vinci PAS 2.1 profiles.
- Preserve Bundle
fullUrlvalues and ensure all internal references resolve correctly. - Use the exact CareFirst-published canonical profiles, extension URLs, code systems, value sets, and operation definitions.
- Support FHIR Bundle, Claim, ClaimResponse, Patient, Coverage, Organization, Practitioner, PractitionerRole, Location, DocumentReference, Parameters, and OperationOutcome resources as applicable.
- Validate requests locally before transmitting them.
- Send and receive
- Submit request requirements
- Send a collection Bundle containing one focal Claim and all required supporting resources.
- Set
Claim.usetopreauthorization. - Set Claim type to
professionalorinstitutionalusinghttp://terminology.hl7.org/CodeSystem/claim-type. - Include a resolvable Patient and Coverage.
- Populate
Coverage.subscriberIdwhenever available. If it is absent, supply a Coverage identifier with type codeMB. - Include at least one patient name and a valid
Patient.birthDate. - Include an ICD-10-CM diagnosis.
- On every service line, include a supported CPT or HCPCS code, service date or period, CMS Place of Service code, quantity greater than zero, and applicable unit or code.
- Include required requesting, referring, servicing, facility, or admitting provider information according to claim type and authorization class.
- Include Organization Tax ID as required by the CareFirst contract.
- For HealthEdge/GuidingCare routing, include the servicing provider in
Claim.careTeamwith role codeSJ. - For inpatient requests, include admission dates and use
Daysas the unit type on the first authorization line, with the remaining lines populated according to the CareFirst inpatient rule.
- Create and update correlation
- For a create request, omit
Claim.related.claimunless the CareFirst contract requires another permitted relationship. - For an update request, populate
Claim.related.claim.referencewith the Claim identifier associated with the original create request. - Retain the Claim reference and authorization identifiers returned from the create workflow.
- Do not submit an update before a successful create has been registered in CareFirst systems.
- Carelon updates are not supported. Submit a new authorization when instructed by the rejection response.
- For updated or added lines, populate the PAS information-changed extension and preserve the original decision sequence information when required.
- For line removal or authorization cancellation, use the CareFirst-supported PAS cancellation/certification extensions.
- Existing attachments cannot be replaced or cancelled through the current update workflow. New or changed supporting information is treated as an addition.
- For a create request, omit
- Supporting documentation
- Include supporting documents through the Claim supporting-information structure required by the CareFirst PAS contract.
- Populate attachment
contentType, data, and title when available. - Supported formats include common PDF, image, Microsoft Office, text, CSV, XML, JSON, FHIR, ZIP, CDA, HL7, and signed-document formats.
- Unsupported or missing MIME types may be mapped to
TXTfor the GuidingCare path. Consumers should therefore send a valid MIME type whenever possible. - Do not exceed environment-specific payload and attachment limits.
- Inquiry request requirements
- Use one of the supported inquiry search modes described below.
- For member-based searches, provide Subscriber ID, date of birth, and the name elements required by the CareFirst contract.
- Include provider NPI and Organization Tax ID when provider filtering applies.
- If an Administrative Reference Number is provided on multiple lines, use the same value on every line.
- Provide CPT/HCPCS codes and requested service dates only when they should constrain the search.
- Do not use insurer as an inquiry filter. If present, it is ignored.
- Be prepared to receive an empty searchset Bundle when no authorization matches.
- Operational readiness
- Generate and propagate the correlation identifiers required by the environment contract.
- Implement safe timeout and retry handling.
- Do not place PHI in URLs, correlation identifiers, analytics, or unapproved logs.
- Inspect both HTTP status and FHIR response content.
- Support ClaimResponse outcomes including
queuedanderror. - Preserve request identifiers so queued responses can be followed through the inquiry or notification workflow.
Illustrative submit request
{
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"fullUrl": "urn:uuid:claim-1",
"resource": {
"resourceType": "Claim",
"id": "claim-1",
"status": "active",
"type": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/claim-type",
"code": "professional"
}
]
},
"use": "preauthorization",
"patient": { "reference": "urn:uuid:patient-1" },
"insurer": { "reference": "urn:uuid:insurer-1" },
"provider": { "reference": "urn:uuid:provider-role-1" },
"priority": {
"coding": [
{
"system": "http://terminology.hl7.org/CodeSystem/processpriority",
"code": "normal"
}
]
},
"diagnosis": [
{
"sequence": 1,
"diagnosisCodeableConcept": {
"coding": [
{
"system": "http://hl7.org/fhir/sid/icd-10-cm",
"code": "Z00.00"
}
]
}
}
],
"item": [
{
"sequence": 1,
"productOrService": {
"coding": [
{
"system": "http://www.ama-assn.org/go/cpt",
"code": "00000"
}
]
},
"servicedDate": "2026-10-01",
"locationCodeableConcept": {
"coding": [
{
"system": "https://www.cms.gov/Medicare/Coding/place-of-service-codes/Place_of_Service_Code_Set",
"code": "11"
}
]
},
"quantity": {
"value": 1,
"unit": "unit"
}
}
]
}
},
{
"fullUrl": "urn:uuid:patient-1",
"resource": {
"resourceType": "Patient",
"id": "patient-1",
"name": [{ "family": "Example", "given": ["Patient"] }],
"birthDate": "1980-01-01"
}
},
{
"fullUrl": "urn:uuid:coverage-1",
"resource": {
"resourceType": "Coverage",
"id": "coverage-1",
"status": "active",
"subscriberId": "ABC123456789",
"beneficiary": { "reference": "urn:uuid:patient-1" }
}
}
]
}
The sample is intentionally abbreviated and uses a placeholder procedure code. It is not a production-ready PAS Bundle. Consumers must include all resources, extensions, identifiers, and references required by the published CareFirst PAS profile.
4 Supported Capabilities
Submit a new authorization
- Accept a Da Vinci PAS 2.1 Claim Bundle at
POST /Claim/$submit. - Validate FHIR structure, required fields, cardinalities, references, and code bindings.
- Resolve Subscriber ID from
Coverage.subscriberIdor theMBCoverage identifier. - Support professional and institutional claims.
- Validate member, diagnosis, procedure, service date, location, quantity, unit, and provider information.
- Determine member plan routing using subscriber-prefix and plan-profile logic.
- Route HOST requests to the BCBSA Interoperability Hub.
- Reject unsupported CFA and applicable inbound FEP PPO scenarios.
- Evaluate CareFirst authorization rules for eligible requests.
- Route requests to EviCore, Carelon, or HealthEdge/GuidingCare based on the rules result.
- Return vendor decisions without changing their clinical meaning.
- Return a queued ClaimResponse when a configured synchronous timeout or applicable 503 condition occurs.
- Return structured inline PAS rejection Bundles for correctable business-data issues.
Update an existing authorization
- Identify an update through
Claim.related.claim. - Resolve the original authorization and vendor from CareFirst claim correlation data.
- Reject an update when the prior create cannot be found.
- Reject Carelon updates and direct the caller to create a new request.
- Ensure the vendor determined for the update matches the vendor used for the original create.
- Support adding or changing a service line.
- Support removing a service line using the applicable PAS cancellation/certification extension.
- Support cancelling an entire authorization.
- Support adding new or changed supporting information.
- Preserve the original line decision sequence where required.
Inquire about authorization status
- Accept
POST /Claim/$inquiry. - Support direct Administrative Reference Number searches.
- Support Member + Provider searches.
- Support optional procedure-code filtering.
- Support optional requested-service-date filtering.
- Support combined Administrative Reference Number, Member, Provider, procedure-code, and service-date criteria.
- Route non-CareFirst member inquiries to the BCBSA Interoperability Hub.
- Resolve CareFirst member identity and deterministic AHDS Patient ID.
- Query AHDS and EviCore in parallel for eligible CareFirst inquiries.
- Deduplicate results by authorization identifier, with AHDS taking precedence.
- Apply provider, service-date, and procedure-code filters.
- Return a FHIR searchset Bundle.
- Return HTTP 200 with
total: 0for a valid search with no matches. - Include Organization or Practitioner/Organization/PractitionerRole resources needed to resolve provider references.
Supported inquiry modes
| Search mode | Required criteria |
|---|---|
| Authorization number | Administrative Reference Number. Member information may still be used for internal identity resolution. |
| Member + Provider | Subscriber ID, patient identity fields, provider NPI, and required Organization Tax ID. |
| Member + Provider + Procedures | Member and provider criteria plus one or more CPT/HCPCS codes. |
| Member + Provider + Service Dates | Member and provider criteria plus start date, end date, or both. |
| Combined | Member, provider, procedures, service dates, and Administrative Reference Number. |
Illustrative HTTP requests
POST /Claim/$submit HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
POST /Claim/$inquiry HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
Illustrative queued response
{
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "ClaimResponse",
"status": "active",
"use": "preauthorization",
"patient": { "reference": "Patient/patient-1" },
"insurer": { "reference": "Organization/insurer-1" },
"request": { "reference": "Claim/claim-1" },
"outcome": "queued"
}
}
]
}
A queued response indicates that a final decision was not available within the synchronous processing window. It is not an approval. Consumers should retain the Claim identifier and use the approved inquiry or notification process to obtain the final result.
Illustrative empty inquiry response
{
"resourceType": "Bundle",
"type": "searchset",
"total": 0,
"entry": []
}
5 Limitations
- Only professional and institutional Claim types are supported.
- PAS submission supports the CareFirst-published Da Vinci PAS 2.1 profile. Other FHIR claim profiles are not accepted unless explicitly documented.
- A transport-level HTTP 200 response may contain an inline rejection ClaimResponse with
outcome: error. - A queued ClaimResponse is not a final decision and may not contain an authorization number.
- Carelon update requests are not supported.
- Update routing requires a valid prior Claim correlation in CareFirst claim data.
- A vendor change between create and update is not supported. The consumer must submit a new authorization when instructed.
- Existing supporting documents cannot currently be replaced or cancelled through the update operation.
- Unsupported attachment MIME types may be converted to text for the GuidingCare route.
- HOST processing depends on the BCBSA Interoperability Hub.
- EviCore and Carelon processing depends on vendor availability and vendor-specific validation.
- Inquiry insurer filtering is not supported.
- Inquiry queries are capped by the CareFirst AHDS result limit. The referenced design uses
_count=100; pagination behavior remains release specific. - Inquiry service-date and procedure-code filtering may be performed after records are retrieved.
- EviCore inquiry failure is non-blocking. When it fails, the response may contain AHDS results only.
- A valid inquiry with no matches returns an empty searchset, not HTTP 404.
- Final denial-reason crosswalks and some vendor-specific mappings may remain release dependent.
- Endpoint URLs, OAuth scopes, headers, total timeout budget, retry counts, request-size limits, attachment-size limits, rate limits, and service levels are environment specific.
6 Typical Interaction
Submit create workflow
- The EHR constructs a PAS 2.1 collection Bundle containing the Claim and supporting resources.
- The EHR calls
POST /Claim/$submit. - CareFirst authenticates the caller and validates the PAS Bundle.
- CareFirst resolves Subscriber ID and validates Claim type.
- Because
Claim.related.claimis absent, CareFirst classifies the request as create. - CareFirst validates patient identity, diagnosis, service codes, dates, locations, quantities, units, and provider information.
- CareFirst derives the member prefix and determines HOME, HOST, CFA, or applicable special routing.
- HOST requests are forwarded to the BCBSA Interoperability Hub. Eligible HOME requests continue to CareFirst authorization rules.
- CareFirst determines the delegated vendor.
- The request is routed to EviCore, Carelon, or HealthEdge/GuidingCare.
- CareFirst returns a decision Bundle, inline rejection Bundle, queued acknowledgement, or OperationOutcome.
- The consumer inspects ClaimResponse outcome and decision details rather than relying on HTTP status alone.
Submit update workflow
- The EHR includes
Claim.related.claim.referencefor the original Claim. - CareFirst resolves the prior authorization and original vendor.
- If no prior create exists, CareFirst rejects the update.
- If the original vendor is Carelon, CareFirst returns a structured rejection requiring a new authorization.
- Standard submit validations and authorization rules are evaluated.
- CareFirst verifies that the current vendor matches the original vendor.
- CareFirst applies supported line, cancellation, or supporting-information update logic.
- The applicable downstream system processes the update.
- CareFirst returns the resulting PAS response.
Inquiry workflow
- The EHR constructs the inquiry request with a supported criteria combination.
- The EHR calls
POST /Claim/$inquiry. - CareFirst validates member information and Administrative Reference Number consistency.
- CareFirst determines CareFirst versus non-CareFirst routing.
- Non-CareFirst inquiries are forwarded to the BCBSA Interoperability Hub.
- For a CareFirst member, CareFirst resolves MemberLifeID and generates the AHDS Patient ID.
- CareFirst queries AHDS and EviCore in parallel.
- CareFirst combines and deduplicates the results.
- CareFirst applies provider, service-date, and procedure-code filters.
- CareFirst builds a searchset Bundle and resolves provider references.
- CareFirst returns matching ClaimResponses or an empty searchset.
$submit
-> Authenticate and validate PAS Bundle
-> Resolve subscriber and claim type
-> Classify create or update
-> Apply required-field validations
-> Determine plan route
-> Evaluate authorization rules
-> Select vendor
-> Return decision, rejection, queued response, or OperationOutcome
$inquiry
-> Authenticate and validate search request
-> Resolve member and plan route
-> Query AHDS and EviCore when applicable
-> Deduplicate and filter results
-> Resolve provider references
-> Return searchset Bundle
Internal ClaimResponse persistence
Authorization events from GuidingCare are transformed internally into Da Vinci PAS 2.1 ClaimResponse resources and stored in AHDS. The internal process enriches provider details, resolves the related Claim where possible, maps authorization and line decisions to X12 review-action codes, persists the ClaimResponse, and publishes a thin notification event after a successful write. Third-party consumers do not call this persistence flow directly.
7 Core Schema Elements
Submit request
| Element | Type | Direction | Description |
|---|---|---|---|
| Bundle | FHIR resource | Request | Collection containing the focal Claim and supporting resources. |
Bundle.type | code | Request | Expected to be collection according to the CareFirst contract. |
| Claim | FHIR resource | Request | Prior authorization request. |
Claim.use | code | Request | Must be preauthorization. |
Claim.type | CodeableConcept | Request | professional or institutional. |
Claim.related.claim | Reference | Request | Identifies the prior Claim for an update. Absence indicates create. |
Claim.patient | Reference | Request | Reference to the Patient. |
Claim.insurer | Reference | Request | Reference to the payer Organization. |
Claim.provider | Reference | Request | Reference to the requesting provider or organization. |
Claim.careTeam | array | Request | Provider roles, including servicing provider role SJ when required. |
Claim.diagnosis | array | Request | At least one supported ICD-10-CM diagnosis. |
Claim.item | array | Request | Requested service lines. |
Claim.item.productOrService | CodeableConcept | Request | Supported CPT or HCPCS service code. |
Claim.item.serviced[x] | date or Period | Request | Requested service date or period. |
Claim.item.location[x] | CodeableConcept or Reference | Request | Valid CMS Place of Service or contract-supported location. |
Claim.item.quantity | Quantity | Request | Quantity greater than zero and applicable unit/code. |
Claim.supportingInfo | array | Request | Clinical documentation and attachments. |
| Patient | FHIR resource | Request | Member demographics and birth date. |
| Coverage | FHIR resource | Request | Subscriber and coverage information. |
Coverage.subscriberId | string | Request | Primary subscriber identifier source. |
Coverage identifier type MB | Identifier | Request | Fallback member identifier. |
Submit response
| Element | Type | Direction | Description |
|---|---|---|---|
| Bundle | FHIR resource | Response | Contains ClaimResponse and applicable supporting resources. |
| ClaimResponse | FHIR resource | Response | Authorization outcome, adjudication, identifiers, and errors. |
ClaimResponse.outcome | code | Response | May indicate complete processing, queued processing, or error according to the returned profile. |
ClaimResponse.identifier | array | Response | Claim and/or authorization identifiers. |
ClaimResponse.request | Reference | Response | Reference to the related Claim when available. |
ClaimResponse.item | array | Response | Line-level authorization decisions. |
ClaimResponse.adjudication | array | Response | Header-level review action and decision information. |
ClaimResponse.processNote | array | Response | Human-readable processing or rejection details. |
ClaimResponse.error | array | Response | Structured PAS/X12 error data. |
| OperationOutcome | FHIR resource | Error | Structural, routing, system, or unsupported-scenario error. |
Inquiry request and response
| Element | Type | Direction | Description |
|---|---|---|---|
| Administrative Reference Number | identifier | Request | Authorization identifier used for direct lookup or combined filtering. |
| Subscriber ID | string | Request | Member coverage identifier. |
| Patient name and DOB | demographic data | Request | Used for member identity resolution. |
| Provider NPI | identifier | Request | Used to filter requestor/provider. |
| Organization Tax ID | identifier | Request | Required for applicable provider filtering. |
| Procedure codes | Coding array | Request | Optional CPT/HCPCS constraints. |
| Requested service dates | date or Period | Request | Optional date constraints. |
| searchset Bundle | FHIR Bundle | Response | Inquiry response containing zero or more matching resources. |
Bundle.total | unsignedInt | Response | Number of matching ClaimResponse entries. |
Bundle.entry.search.mode | code | Response | match for matching authorization records. |
| Practitioner | FHIR resource | Response | Individual provider when needed to resolve a reference. |
| Organization | FHIR resource | Response | Provider organization. |
| PractitionerRole | FHIR resource | Response | Connects Practitioner and Organization. |
Decision and error interpretation
- Header and line-level authorization decisions can be represented with X12 review-action codes.
- Typical decision mappings include approved, partially approved, denied, pending, and cancelled states.
- Inline rejections use ClaimResponse
processNoteanderrorwith PAS error-element and follow-up-action extensions. - An OperationOutcome generally indicates that the request could not proceed as a valid PAS business transaction.
- A ClaimResponse with
outcome: erroris a processed PAS rejection and may be returned with HTTP 200. - A ClaimResponse with
outcome: queuedindicates pending processing.
8 Validation and Error Handling
Common transport and structure validation
| Scenario | Expected handling |
|---|---|
| Missing, expired, invalid, or incorrectly scoped token | Return the applicable 401 or 403 response. |
| Unsupported media type | Return 415. |
| Malformed JSON | Return HTTP 400 with OperationOutcome. |
| PAS profile validation failure | Return HTTP 400 with OperationOutcome listing validation issues. |
| Unsupported Claim type | Return HTTP 400 with OperationOutcome. |
| Rate limit exceeded | Return 429 when applicable and honor Retry-After. |
| Unexpected internal failure | Return a safe 500 or 503 response without credentials, stack traces, internal hostnames, or PHI. |
Submit business validation
| Scenario | Expected handling |
|---|---|
| Subscriber ID cannot be resolved | HTTP 200 inline rejection with progress note and PAS error details. |
| Required patient name absent | HTTP 200 inline rejection. |
| Birth date absent or invalid | HTTP 200 inline rejection. |
| CPT/HCPCS missing on a line | HTTP 200 inline rejection identifying affected lines. |
| Service date missing on a line | HTTP 200 inline rejection identifying affected lines. |
| CMS Place of Service missing or invalid | HTTP 200 inline rejection. |
| Quantity is missing, not positive, or unit/code is missing | HTTP 200 inline rejection. |
| ICD-10-CM diagnosis missing | HTTP 200 inline rejection. |
| BCBSA inbound request for unsupported FEP PPO member | Return HTTP 400 with OperationOutcome. |
| Plan profile is CFA | Return the contract-defined client error with OperationOutcome. |
| Plan Profile or Auth Rules times out | Return the contract-defined system error, normally 503. |
| Auth Rules returns a recognized member error | HTTP 200 inline rejection with a human-readable progress note. |
| Multiple vendors or incompatible authorization classes/templates are returned | HTTP 200 inline rejection. |
| A line is identified as not requiring authorization in a request that cannot be processed as submitted | HTTP 200 inline rejection. |
Servicing provider role SJ is absent for the applicable HealthEdge route | HTTP 200 inline rejection. |
| Inpatient admission dates are absent | HTTP 200 inline rejection. |
| Inpatient quantity/unit rules are not satisfied | HTTP 200 inline rejection. |
| Downstream vendor returns 4xx | Return OperationOutcome; do not automatically retry. |
| Downstream vendor times out or returns 503 | Return queued acknowledgement according to the submit contract. |
| Downstream vendor returns another retryable 5xx | Apply bounded retry; return OperationOutcome after exhaustion. |
Update validation
| Scenario | Expected handling |
|---|---|
Claim.related.claim does not resolve to a prior create | Return OperationOutcome stating that update is not allowed because create has not occurred. |
| Original vendor is Carelon | HTTP 200 inline rejection requiring a new authorization. |
| Current vendor differs from original vendor | HTTP 200 inline rejection requiring a new request. |
| Existing attachment is changed or cancelled | Not supported; only permitted additions are processed. |
Inquiry validation
| Scenario | Expected handling |
|---|---|
| Required member identifiers are missing | Return HTTP 400 with OperationOutcome. |
| Administrative Reference Numbers differ across lines | Return HTTP 400 with OperationOutcome. |
| Plan routing service is unavailable | Return HTTP 502 with OperationOutcome. |
| Member cannot be uniquely resolved | Return HTTP 404 with OperationOutcome. |
| Member identity service is unavailable | Return HTTP 502 with OperationOutcome. |
| Organization Tax ID required for provider filtering is absent | Return HTTP 400 with OperationOutcome. |
| AHDS authorization service is unavailable | Return HTTP 502 with OperationOutcome. |
| EviCore inquiry fails | Log the failure and continue with AHDS results. |
| No records match all filters | Return HTTP 200 with an empty searchset Bundle. |
Procedure code is not-applicable | Skip procedure-code filtering. |
Illustrative inline rejection
{
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "ClaimResponse",
"status": "active",
"use": "preauthorization",
"outcome": "error",
"processNote": [
{
"number": 1,
"text": "The request is missing information required for prior authorization processing."
}
],
"error": [
{
"extension": [
{
"url": "http://hl7.org/fhir/us/davinci-pas/StructureDefinition/extension-errorElement",
"valueString": "2000E"
},
{
"url": "http://hl7.org/fhir/us/davinci-pas/StructureDefinition/extension-errorFollowupAction",
"valueCodeableConcept": {
"coding": [
{
"system": "https://codesystem.x12.org/005010/889",
"code": "C"
}
]
}
}
],
"code": {
"coding": [
{
"system": "https://codesystem.x12.org/005010/901",
"code": "33"
}
]
}
}
]
}
}
]
}
The exact error element, follow-up action, reason code, and process note depend on the failed validation and the published CareFirst mapping.
Consumer error-handling requirements
- Inspect the HTTP status, top-level FHIR resource type, ClaimResponse outcome, process notes, adjudication, and error elements.
- Do not treat HTTP 200 as approval.
- Do not treat
queuedas approval or denial. - Do not retry structural or business validation failures without correcting the request.
- Do not automatically retry vendor 4xx responses.
- Retry transient errors only when permitted by the CareFirst contract and use bounded backoff.
- Retain the same business identifiers and correlation context for permitted retries.
- When a queued response is returned, retain the Claim identifier and use inquiry or the approved notification workflow.
- Log only approved operational data. Do not log tokens, secrets, complete clinical payloads, full member identifiers, or attachments unless explicitly permitted.
- When the result is unavailable or ambiguous, do not represent the service as authorized or guaranteed to be covered or paid.
Prior Authorization Subscription and Notification (SN) API
1. Overview
The CareFirst Prior Authorization Subscription and Notification API enables a provider Electronic Health Record (EHR), authorized provider application, or the BCBSA Interoperability Hub to register for and receive FHIR-based prior authorization status notifications.
The business objective is to notify a provider when a previously submitted prior authorization request changes, especially when the original PAS response was pended or queued, without requiring the provider to poll repeatedly for an updated decision.
The API combines two related capabilities:
- Subscription management, used to create and update the organization’s subscription, filter criteria, callback endpoint, payload preference, and delivery headers.
- Notification delivery, used by CareFirst to send handshake and prior authorization event notifications to the registered endpoint.
The consumer-facing operations are:
POST /Subscriptionto create a subscription.PUT /Subscription/{id}to replace or update an existing subscription.POST /Subscription/$statusto retrieve the current subscription lifecycle status.DELETE /Subscription/{id}to deactivate an existing subscription.POST /$notification-hookas the callback operation that the subscriber must expose to receive handshake and event-notification Bundles.
CareFirst generates the Subscription identifier, persists the subscription and filters, verifies a provider callback endpoint by sending a handshake notification, and updates the subscription status based on the handshake result. For provider-originated subscriptions, CareFirst also coordinates applicable inter-plan registration with BCBSA. For an update, CareFirst detects filter and endpoint changes and invokes only the required downstream actions. The $status operation provides read-only lifecycle visibility. The delete operation performs a soft delete by setting the subscription status to off; the subscription and filter records remain available for audit.
When a prior authorization event is received from CareFirst systems, a delegated vendor, or BCBSA, CareFirst acknowledges the source, matches active subscriptions using registered organization identifiers such as NPI or Tax ID, constructs a FHIR notification Bundle, and delivers it to each matching callback endpoint. The inbound acknowledgement is separated from the asynchronous matching and outbound delivery process.
A successful subscription response means that the registration request was accepted and persisted. Consumers must inspect Subscription.status. A status of requested means endpoint verification may still be pending. A status of error means the endpoint or another subscription activity failed. A notification acknowledgement confirms receipt by the callback endpoint and does not represent an authorization decision.
This document is a third-party integration guide. The CareFirst-published OpenAPI contract, FHIR profiles, onboarding materials, and environment-specific specifications remain authoritative for base URLs, OAuth scopes, headers, callback allowlisting, filter syntax, timeouts, retry behavior, and release-specific requirements.
2. API Profile
| Attribute | Value |
|---|---|
| API | CareFirst Prior Authorization Subscription and Notification (SN) |
| Business objective | Push prior authorization status changes to subscribed provider organizations without manual polling. |
| API style | REST using HL7 FHIR R4 JSON and Subscriptions Backport semantics |
| FHIR version | HL7 FHIR R4 |
| PAS alignment | Da Vinci PAS Subscription profile and PAS SubscriptionTopic |
| Authentication | OAuth 2.0/JWT and CareFirst-issued API access controls for management operations |
| Transport | HTTPS using CareFirst-approved TLS configuration |
| Media type | application/fhir+json |
| Create operation | POST /Subscription |
| Update operation | PUT /Subscription/{id} |
| Status operation | POST /Subscription/$status |
| Delete operation | DELETE /Subscription/{id} |
| Callback operation | POST /$notification-hook |
| Subscription channel | REST hook |
| Subscription topic | http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic |
| Handshake processing | Synchronous for create; asynchronous after an endpoint-changing update |
| Event delivery | Asynchronous after CareFirst acknowledges the originating notification source |
| Error representation | FHIR OperationOutcome |
Operation summary
| Operation | Consumer role | Result |
|---|---|---|
POST /Subscription | Submit a new PAS Subscription. | HTTP 201 with the CareFirst-assigned Subscription ID and resulting status, or OperationOutcome. |
PUT /Subscription/{id} | Replace/update an existing subscription. | HTTP 200 with the updated Subscription; endpoint verification may continue asynchronously. |
POST /Subscription/$status | Query the current lifecycle status of a subscription. | HTTP 200 searchset Bundle containing status Parameters, or OperationOutcome. |
DELETE /Subscription/{id} | Deactivate a subscription without physically removing its records. | HTTP 200 after local deactivation, or OperationOutcome for validation, lookup, or persistence failure. |
POST /$notification-hook | Receive a handshake or event notification at the registered endpoint. | Subscriber returns a successful 2xx acknowledgement after validating and durably accepting the notification. |
Subscription status interpretation
| Status | Meaning for the consumer |
|---|---|
requested | Registration or endpoint verification is pending. Event delivery must not be assumed active. |
active | Handshake verification succeeded and the subscription is eligible for event matching and delivery. |
error | Handshake verification or another lifecycle activity failed. The subscription is not eligible for normal delivery. |
off | Subscription is not active for notification delivery. |
3 Prerequisites
Before integrating with the API, a third-party consumer must complete the following prerequisites.
- Application onboarding
- Register the organization and application through the CareFirst API onboarding process.
- Obtain the Subscription and Notification product entitlement for every environment.
- Complete required security, privacy, legal, connectivity, and callback-endpoint reviews.
- Obtain the base URL, OAuth token endpoint, API key, scopes, required source headers, and support contacts.
- Authentication and transport
- Implement OAuth 2.0/JWT as defined by the CareFirst environment contract.
- Send the bearer token, API access key, and required correlation headers on subscription-management requests.
- Use HTTPS and the CareFirst-approved TLS configuration.
- Store credentials and callback secrets in an approved secret store.
- Do not put access tokens, secrets, PHI, or sensitive identifiers in URLs or unapproved logs.
- FHIR Subscription support
- Send and receive
application/fhir+json. - Build the Subscription using the CareFirst-supported PAS Subscription profile.
- Use the PAS SubscriptionTopic canonical URL required by the published contract.
- Use a REST-hook channel.
- Supply a valid HTTPS
channel.endpointthat can receive POST requests from the CareFirst-approved network path. - Include at least one organization filter. The filter identifies the organization for which notifications will be delivered.
- Use NPI and/or Tax ID filter systems and values exactly as defined in the CareFirst contract.
- Provide the complete desired header set. Headers are stored as a complete map and are not partially merged during an update.
- Request the supported payload type, normally
application/fhir+jsonwith full-resource content.
- Send and receive
- Callback endpoint implementation
- Expose
POST /$notification-hook, or provide an equivalent callback URL accepted by CareFirst onboarding. - Accept a FHIR Bundle of type
history. - Support both
handshakeandevent-notificationvalues in the Parameters resource. - Return an HTTP 2xx response only after the message has been validated sufficiently and durably accepted for processing.
- Make the callback idempotent. The same notification may be delivered more than once.
- Do not assume notifications arrive in event-number order.
- Correlate the message using the Subscription reference, event number, notification timestamp, and PAS Bundle identifiers.
- Process the PAS ClaimResponse Bundle included as the event focus.
- Preserve unknown FHIR extensions and supporting resources unless the published profile states otherwise.
- Expose
- Callback connectivity
- Ensure the registered endpoint is reachable from the approved CareFirst/APIM network route.
- Complete any IP allowlisting, DNS, certificate, and firewall configuration required during onboarding.
- Use a production-grade TLS certificate with a valid trust chain and matching host name.
- Do not redirect the callback to an unregistered domain.
- Keep the endpoint available during the handshake and subsequent event delivery.
- Create-request requirements
- Do not assign or depend on the inbound
Subscription.id; CareFirst generates the authoritative GUID for a new subscription. - Include the subscription topic, reason, filter criteria, callback endpoint, headers when needed, and payload preference.
- Understand that CareFirst initially stores a provider-originated subscription with status
requestedand changes it toactiveonly after a successful handshake. - Retain the CareFirst-assigned Subscription ID returned by the create operation.
- Do not assign or depend on the inbound
- Update-request requirements
- For a provider-originated update, use the CareFirst Subscription ID as
{id}. - Send the complete updated Subscription resource, not only changed fields.
- Continue to include at least one filter and a valid callback endpoint.
- Retain the original source and any BCBSA correlation data. The update operation does not replace those values.
- Recognize that a filter change can trigger inter-plan synchronization.
- Recognize that an endpoint change resets status to
requestedand triggers asynchronous handshake verification after the HTTP 200 response.
- For a provider-originated update, use the CareFirst Subscription ID as
- Status and delete support
- Retain the CareFirst Subscription ID returned by create. Providers use this ID for
$status, update, and delete. - Build the
$statusrequest as a FHIR Parameters resource containingparameter[name="id"].valueId. - Do not include a request body with DELETE. Supply the identifier in the path.
- For provider requests, the identifier is the internal CareFirst Subscription GUID. For BCBSA-originated requests, the identifier is the BCBSA correlation ID.
- Interpret delete as deactivation, not physical removal. CareFirst sets status to
offand retains the subscription and filters for audit. - Treat delete as idempotent. Deleting a subscription already in
offstatus returns HTTP 200 without additional downstream calls.
- Retain the CareFirst Subscription ID returned by create. Providers use this ID for
- Security and privacy for notification payloads
- Treat notification payloads as PHI-bearing clinical transactions.
- Encrypt stored payloads and limit access to authorized users and services.
- Avoid logging the full Bundle unless explicitly permitted by the organization’s CareFirst-approved logging controls.
- Validate the inbound connection and any agreed CareFirst routing or identification headers.
- Do not make authorization decisions from transport metadata alone. Inspect the ClaimResponse in the focus Bundle.
Illustrative create request
{
"resourceType": "Subscription",
"meta": {
"profile": [
"http://hl7.org/fhir/us/davinci-pas/StructureDefinition/profile-subscription"
]
},
"status": "requested",
"reason": "Receive notifications about prior authorization ClaimResponse updates.",
"criteria": "http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic",
"_criteria": {
"extension": [
{
"url": "http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-filter-criteria",
"valueString": "orgIdentifier=http://hl7.org/fhir/sid/us-npi|1234567890"
}
]
},
"channel": {
"type": "rest-hook",
"endpoint": "https://ehr.example.org/fhir/$notification-hook",
"payload": "application/fhir+json",
"_payload": {
"extension": [
{
"url": "http://hl7.org/fhir/uv/subscriptions-backport/StructureDefinition/backport-payload-content",
"valueCode": "full-resource"
}
]
}
}
}
The example is illustrative. Use the exact filter syntax, identifier systems, Subscription profile, and payload extension required by the CareFirst release contract.
4 Supported Capabilities
Create a subscription
- Accept
POST /Subscriptionfrom an authorized provider system or BCBSA route. - Validate the presence of at least one filter criterion.
- Validate that
channel.endpointis present and is a supported HTTP or HTTPS URL. - Generate the authoritative Subscription GUID.
- Determine whether the source is
PROVIDERorBCBSAusing approved source-identification headers. - Persist the Subscription and one filter record for every filter criterion.
- For a provider-originated request, preserve the provider endpoint and register applicable subscription information through the inter-plan route.
- For a BCBSA-originated request, use the internal CareFirst inbound notification endpoint for routed delivery.
- Send a FHIR handshake notification to the stored endpoint after persistence.
- Change the subscription status to
activeafter a successful handshake. - Change the subscription status to
errorand store error details after a failed handshake. - Return the generated Subscription ID to the caller.
Update a subscription
- Accept
PUT /Subscription/{id}. - For provider requests, locate the record by CareFirst Subscription ID.
- For BCBSA requests, locate the record by BCBSA correlation ID.
- Return HTTP 404 when the Subscription cannot be found.
- Compare the inbound topic, reason, endpoint, headers, payload preference, and filter criteria with the stored record.
- Replace the full stored header map when header values change.
- Replace stored filter rows when filter criteria change.
- Notify BCBSA only when provider-originated filter criteria change.
- Trigger endpoint handshake verification only when the provider callback endpoint changes.
- Persist changes before initiating external synchronization or endpoint verification.
- Return HTTP 200 with the updated Subscription without waiting for an asynchronous endpoint handshake.
- Keep a provider subscription in
requestedstatus until the asynchronous handshake succeeds or fails. - Treat an identical PUT as idempotent and avoid duplicate external calls when relevant data has not changed.
Query subscription status
- Accept
POST /Subscription/$statuswith a FHIR Parameters request. - Read the identifier from
parameter[name="id"].valueId. - Use the CareFirst Subscription ID for provider requests and the BCBSA correlation ID for BCBSA requests.
- Return a FHIR searchset Bundle with exactly one Parameters entry when found.
- Return the subscription reference, topic, current status, notification type
query-status, and events-since-subscription-start value. - Use the internal Subscription ID in a provider-facing reference and the BCBSA correlation ID in a BCBSA-facing reference.
- Include one or more
errorparameters when the stored status iserror. - Perform no data modification. The operation is read-only.
- Return
events-since-subscription-startas0in the current implementation because event counting is not yet implemented.
Delete a subscription
- Accept
DELETE /Subscription/{id}with no FHIR request body. - Use the CareFirst Subscription ID as
{id}for provider requests and the BCBSA correlation ID for BCBSA requests. - Retrieve the existing Subscription before deactivation.
- Soft-delete the record by setting status to
off; retain subscription and filter records for audit. - For provider-originated deletes, attempt BCBSA deregistration using the stored BCBSA correlation ID after local deactivation succeeds.
- For BCBSA-originated deletes, perform local deactivation only and do not call BCBSA back.
- Return HTTP 200 if the provider-side local deactivation succeeds, even if the subsequent BCBSA deregistration fails. The BCBSA failure is logged for operational review.
- Return HTTP 200 without further calls when the subscription is already
off.
Receive handshake notifications
- Receive a Bundle of type
history. - Read the Parameters resource in the first Bundle entry.
- Verify that
typeishandshake. - Read the Subscription and topic references.
- Return a successful 2xx acknowledgement to confirm endpoint reachability.
- Do not expect a PAS ClaimResponse focus Bundle in a handshake notification.
Receive event notifications
- Receive a Bundle of type
historycontaining:- A Parameters resource describing the event.
- A PAS Bundle containing ClaimResponse and supporting resources.
- Read the Subscription reference and PAS topic.
- Verify that status is
activeand type isevent-notification. - Read the event number, timestamp, and focus reference.
- Resolve the focus reference to the PAS Bundle entry.
- Process the ClaimResponse and supporting Patient, Coverage, Organization, Practitioner, and other included resources.
- Return a successful 2xx acknowledgement after accepting the message.
Notification matching and delivery behavior
- Consider only active subscriptions for event delivery.
- Match organization identifiers using the registered NPI or Tax ID filters.
- Treat either a matching NPI or matching Tax ID as sufficient under the current matching design.
- Deliver independently to every active subscription that matches.
- Use provider identifier enrichment when an applicable requestor resource does not contain all identifiers needed for matching.
- Record every inbound event in the CareFirst notification audit flow.
- Track delivery outcomes such as
pending,delivered,failed,unmatched, andenrichment_failed.
Illustrative HTTP requests
POST /Subscription HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
PUT /Subscription/{id} HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
POST /Subscription/$status HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Content-Type: application/fhir+json
Accept: application/fhir+json
DELETE /Subscription/{id} HTTP/1.1
Host: {carefirst-api-host}
Authorization: Bearer {access-token}
x-api-key: {assigned-api-key}
Accept: application/fhir+json
The provider callback must accept:
POST /$notification-hook HTTP/1.1
Host: {registered-provider-host}
Content-Type: application/fhir+json
Illustrative status request
{
"resourceType": "Parameters",
"parameter": [
{
"name": "id",
"valueId": "11111111-2222-3333-4444-555555555555"
}
]
}
Illustrative status response
{
"resourceType": "Bundle",
"type": "searchset",
"timestamp": "2026-09-25T18:15:00Z",
"total": 1,
"entry": [
{
"fullUrl": "urn:uuid:status-parameters-1",
"resource": {
"resourceType": "Parameters",
"parameter": [
{
"name": "subscription",
"valueReference": {
"reference": "Subscription/11111111-2222-3333-4444-555555555555"
}
},
{
"name": "topic",
"valueCanonical": "http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic"
},
{
"name": "status",
"valueCode": "active"
},
{
"name": "type",
"valueCode": "query-status"
},
{
"name": "events-since-subscription-start",
"valueString": "0"
}
]
}
}
]
}
Illustrative handshake notification
{
"resourceType": "Bundle",
"type": "history",
"timestamp": "2026-09-25T18:00:00Z",
"entry": [
{
"fullUrl": "urn:uuid:parameters-1",
"resource": {
"resourceType": "Parameters",
"parameter": [
{
"name": "subscription",
"valueReference": {
"reference": "Subscription/11111111-2222-3333-4444-555555555555"
}
},
{
"name": "topic",
"valueCanonical": "http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic"
},
{
"name": "status",
"valueCode": "requested"
},
{
"name": "type",
"valueCode": "handshake"
},
{
"name": "events-since-subscription-start",
"valueString": "0"
}
]
}
}
]
}
Illustrative event notification
{
"resourceType": "Bundle",
"id": "notification-1",
"type": "history",
"timestamp": "2026-09-25T18:30:00Z",
"entry": [
{
"fullUrl": "urn:uuid:event-parameters-1",
"resource": {
"resourceType": "Parameters",
"parameter": [
{
"name": "subscription",
"valueReference": {
"reference": "Subscription/11111111-2222-3333-4444-555555555555"
}
},
{
"name": "topic",
"valueCanonical": "http://hl7.org/fhir/us/davinci-pas/SubscriptionTopic/PASSubscriptionTopic"
},
{
"name": "status",
"valueCode": "active"
},
{
"name": "type",
"valueCode": "event-notification"
},
{
"name": "notification-event",
"part": [
{
"name": "event-number",
"valueString": "1"
},
{
"name": "timestamp",
"valueInstant": "2026-09-25T18:30:00Z"
},
{
"name": "focus",
"valueReference": {
"reference": "urn:uuid:pas-bundle-1"
}
}
]
}
]
}
},
{
"fullUrl": "urn:uuid:pas-bundle-1",
"resource": {
"resourceType": "Bundle",
"type": "collection",
"entry": [
{
"resource": {
"resourceType": "ClaimResponse",
"status": "active",
"use": "preauthorization",
"outcome": "complete"
}
}
]
}
}
]
}
5 Limitations
- The API supports PAS prior authorization subscription events and is not a general-purpose FHIR event broker.
- Only subscriptions with status
activeare eligible for event delivery. - A create request does not preserve a caller-assigned Subscription ID. CareFirst generates the authoritative ID.
- A provider-originated subscription can remain
requesteduntil callback endpoint verification completes. - On update, filter synchronization and endpoint verification are independent. Both can be triggered by one PUT.
- A provider endpoint change is verified asynchronously after the update response is returned.
- The full callback header map is replaced when headers change. Partial header patch semantics are not supported.
- The inter-plan update result may not be exposed in the provider-facing Subscription response.
$statuscurrently reportsevents-since-subscription-startas0; event counting is not implemented.- Delete is a soft delete only. CareFirst does not physically remove subscription or filter records.
- A provider delete can return HTTP 200 even when BCBSA deregistration fails after local deactivation. The subscription remains
offlocally and the external failure requires operational follow-up. $statusreturns exactly one searchset entry for a found subscription and returns HTTP 404 when no matching subscription exists.- A notification can match more than one active subscription and can be delivered to multiple endpoints.
- Notification delivery can be duplicated or delayed. Consumers must implement idempotency.
- Event sequence tracking and replay behavior are release specific. Consumers must not depend solely on
events-since-subscription-start. - Final retry policies for some inter-plan and callback-delivery failures are release specific.
- Provider identifier enrichment failure can prevent delivery even when an event was accepted by CareFirst.
- The registered callback endpoint must remain reachable and must continue to meet CareFirst connectivity requirements.
- The callback acknowledgment does not indicate that the contained prior authorization was approved.
- Endpoint URLs, scopes, required headers, timeouts, retry counts, volume limits, and service levels vary by environment and release.
6 Typical Interaction
Subscription create workflow
- The provider registers its application and callback endpoint with CareFirst.
- The provider sends
POST /Subscriptionwith the PAS topic, organization filter, endpoint, payload preference, and applicable headers. - CareFirst validates the Subscription and callback URL.
- CareFirst generates the Subscription GUID and persists the subscription with status
requested. - CareFirst performs applicable inter-plan registration for a provider-originated request.
- CareFirst sends a handshake Bundle to the stored callback endpoint.
- The provider validates and acknowledges the handshake.
- CareFirst changes the subscription to
activeafter success, or toerrorafter failure. - CareFirst returns or maintains the resulting subscription lifecycle state according to the create contract.
Subscription update workflow
- The provider sends
PUT /Subscription/{id}with the complete updated Subscription. - CareFirst validates the filter and endpoint.
- CareFirst retrieves the existing record.
- CareFirst compares filters, callback endpoint, headers, topic, reason, and payload preference.
- CareFirst persists the changed fields first.
- If filters changed, CareFirst synchronizes the change with the applicable inter-plan route.
- If the endpoint changed, CareFirst resets status to
requestedand starts an asynchronous handshake. - CareFirst returns HTTP 200 without waiting for the asynchronous handshake.
- The background handshake result changes status to
activeorerror.
Subscription status workflow
- The consumer sends
POST /Subscription/$statuswith a FHIR Parameters body. - CareFirst extracts
parameter[name="id"].valueIdand determines the caller source. - CareFirst looks up the record by internal Subscription ID for a provider or BCBSA correlation ID for BCBSA.
- CareFirst builds a searchset Bundle containing one Parameters resource.
- CareFirst returns the subscription reference, topic, current status,
query-statustype, and event count. - If status is
error, CareFirst also returns stored error code and description parameters. - No subscription data is changed.
Subscription delete workflow
- The consumer sends
DELETE /Subscription/{id}. - CareFirst validates the source-specific identifier and retrieves the subscription.
- If the record is already
off, CareFirst returns HTTP 200 without additional calls. - CareFirst soft-deletes the local record by setting status to
off. - For a provider-originated delete, CareFirst attempts BCBSA deregistration using the stored BCBSA correlation ID.
- For a BCBSA-originated delete, CareFirst does not make an outbound BCBSA call.
- CareFirst returns HTTP 200 after successful local deactivation. A later BCBSA failure is logged and does not roll back the local deactivation.
Prior authorization notification workflow
- A prior authorization status event is generated by CareFirst, a delegated vendor, or BCBSA.
- CareFirst receives and records the event and acknowledges the source.
- CareFirst verifies that the event is part of the applicable PAS workflow.
- CareFirst identifies the requestor Organization or PractitionerRole.
- CareFirst extracts or enriches NPI and Tax ID.
- CareFirst finds every active Subscription whose filter matches either identifier.
- CareFirst constructs a history Bundle containing event Parameters and the PAS focus Bundle.
- CareFirst sends the Bundle to each matching endpoint.
- The provider durably accepts the event and returns a 2xx response.
- CareFirst records delivery as delivered, failed, unmatched, or enrichment failed.
POST /Subscription
-> Validate Subscription and endpoint
-> Generate CareFirst Subscription ID
-> Persist status=requested and filters
-> Perform applicable inter-plan registration
-> Send handshake
-> Set status=active or error
PUT /Subscription/{id}
-> Validate full updated Subscription
-> Retrieve existing record
-> Detect filter and endpoint changes
-> Persist updates
-> Sync changed filters when applicable
-> Verify changed endpoint asynchronously
-> Return updated Subscription
POST /Subscription/$status
-> Validate Parameters ID
-> Retrieve by Subscription ID or BCBSA correlation ID
-> Build one-entry searchset Bundle
-> Return lifecycle status and error details when applicable
DELETE /Subscription/{id}
-> Validate source-specific ID
-> Retrieve existing subscription
-> Soft-delete locally by setting status=off
-> Provider source: attempt BCBSA deregistration
-> Return HTTP 200 after local success
Prior authorization event
-> Audit and acknowledge source
-> Resolve requestor identifiers
-> Match active subscriptions
-> Build PAS event-notification Bundle
-> Deliver to all matched endpoints
-> Record delivery outcome
7 Core Schema Elements
Subscription management
| Element | Type | Direction | Description |
|---|---|---|---|
| Subscription | FHIR resource | Request/Response | PAS notification registration. |
Subscription.id | id | Response/Update | CareFirst-generated identifier. Required in the update path. |
Subscription.status | code | Response | Lifecycle state such as requested, active, error, or off. |
Subscription.reason | string | Request/Response | Human-readable purpose of the subscription. |
Subscription.criteria | string/canonical | Request/Response | PAS SubscriptionTopic reference in the R4 backport representation. |
_criteria.extension | Extension | Request/Response | Backport filter criteria containing organization identifier filters. |
filterBy | array | Request/Response | Release-specific representation of one or more filter criteria. |
channel.type | code | Request/Response | Must represent a REST hook. |
channel.endpoint | URL | Request/Response | Provider callback endpoint. |
channel.header | array | Request/Response | Optional callback headers stored as a complete map. |
channel.payload | string | Request/Response | Requested notification media type. |
_payload.extension | Extension | Request/Response | Backport payload-content preference such as full-resource. |
Status request and response
| Element | Type | Direction | Description |
|---|---|---|---|
| Parameters | FHIR resource | Request | Container for the $status identifier. |
parameter[name="id"].valueId | id | Request | Internal Subscription ID for a provider request, or BCBSA correlation ID for a BCBSA request. |
| Bundle | FHIR resource | Response | Searchset Bundle containing one Parameters resource. |
Bundle.type | code | Response | Always searchset. |
Bundle.total | unsignedInt | Response | Always 1 for a successful lookup. |
parameter[subscription] | Reference | Response | Source-appropriate subscription reference. |
parameter[topic] | canonical | Response | PAS SubscriptionTopic. |
parameter[status] | code | Response | Current lifecycle status from CareFirst storage. |
parameter[type] | code | Response | Always query-status. |
events-since-subscription-start | string | Response | Currently 0. |
parameter[error] | CodeableConcept | Response | Included when status is error; contains stored error code and description. |
Delete request
| Element | Type | Direction | Description |
|---|---|---|---|
{id} | path identifier | Request | Provider Subscription GUID or BCBSA correlation ID. |
| Request body | none | Request | DELETE does not require a FHIR body. |
Subscription.status | code | Internal result | Set to off; records are retained. |
| HTTP 200 | acknowledgement | Response | Confirms successful local deactivation or an already-off idempotent result. |
| OperationOutcome | FHIR resource | Error | Missing identifier, not found, or local persistence failure. |
Handshake and event notification
| Element | Type | Direction | Description |
|---|---|---|---|
| Bundle | FHIR resource | Inbound to provider | Notification envelope. |
Bundle.type | code | Inbound to provider | history. |
Bundle.timestamp | instant | Inbound to provider | Time the notification Bundle was built. |
| Parameters | FHIR resource | Inbound to provider | Subscription status and event metadata. |
parameter[subscription] | Reference | Inbound to provider | Reference to the CareFirst Subscription ID or applicable inter-plan correlation ID. |
parameter[topic] | canonical | Inbound to provider | PAS SubscriptionTopic. |
parameter[status] | code | Inbound to provider | Subscription state associated with the message. |
parameter[type] | code | Inbound to provider | handshake or event-notification. |
events-since-subscription-start | string | Inbound to provider | Release-specific event-count field. |
notification-event.event-number | string | Inbound to provider | Event sequence number for the subscription. |
notification-event.timestamp | instant | Inbound to provider | Event-notification timestamp. |
notification-event.focus | Reference | Inbound to provider | Reference to the PAS Bundle in the notification. |
| PAS Bundle | FHIR Bundle | Inbound to provider | ClaimResponse and supporting resources. |
| ClaimResponse | FHIR resource | Inbound to provider | Prior authorization status, decision, errors, and references. |
Filter and delivery interpretation
- Register one or more organization identifiers using the CareFirst-supported filter syntax.
- A subscription can contain separate filters for NPI and Tax ID.
- The current matching design uses OR behavior. Either identifier can match the subscription.
- Only
activesubscriptions are selected for event delivery. - More than one subscription can match the same event.
- The consumer must correlate the focus PAS Bundle using the
notification-event.focusreference, not by Bundle entry order alone. - The consumer must use the ClaimResponse to interpret the authorization outcome.
8 Validation and Error Handling
Common validation
| Scenario | Expected handling |
|---|---|
| Missing, expired, invalid, or incorrectly scoped access token | Return the applicable 401 or 403 response. |
| Unsupported media type | Return 415. |
| Malformed JSON or invalid FHIR resource | Return HTTP 400 with OperationOutcome. |
| Missing required API key or source header | Reject according to the gateway contract. |
| Rate limit exceeded | Return 429 when applicable and honor Retry-After. |
| Unexpected internal failure | Return a safe 500 or 503 response without stack traces, credentials, internal hostnames, or PHI. |
Create validation and processing
| Scenario | Expected handling |
|---|---|
| Missing filter criteria | Return HTTP 400 with OperationOutcome and do not persist the subscription. |
Missing or invalid channel.endpoint | Return HTTP 400 with OperationOutcome and do not continue. |
| Internal persistence fails | Return HTTP 500 with OperationOutcome. |
| Provider inter-plan registration fails after local persistence | Preserve the local subscription according to the contract and apply the release-specific retry process. |
| Handshake fails | Set subscription status to error, store safe error details, and return the contract-defined failure response. |
| Status update after handshake fails | Log and alert for operational intervention because the persisted status may be stale. |
Update validation and processing
| Scenario | Expected handling |
|---|---|
| Missing filter criteria | Return HTTP 400 with OperationOutcome. |
| Missing or invalid callback endpoint | Return HTTP 400 with OperationOutcome. |
| Subscription ID or BCBSA correlation ID is not found | Return HTTP 404 with OperationOutcome. |
| Initial persistence of changes fails | Return HTTP 500 and do not start external synchronization or handshake. |
| Filter synchronization fails | Return or retain the provider-facing result according to the release contract; the locally persisted update remains. |
| Asynchronous handshake fails | Set status to error and record error code and description. The caller has already received HTTP 200. |
| Asynchronous handshake times out | Set status to error with the configured handshake-timeout code. |
| Background status update fails | Log and alert because status may remain requested. |
Status validation and processing
| Scenario | Expected handling |
|---|---|
| Parameters body is absent or malformed | Return HTTP 400 with OperationOutcome. |
| Provider Subscription ID is absent or blank | Return HTTP 400 with OperationOutcome. |
| BCBSA correlation ID is absent or blank | Return HTTP 400 with OperationOutcome. |
| Subscription cannot be found | Return HTTP 404 with OperationOutcome. |
| Internal lookup fails unexpectedly | Return HTTP 500 with OperationOutcome. |
| Subscription is found | Return HTTP 200 with a one-entry searchset Bundle. |
Stored status is error | Include one or more error Parameters populated from the stored error code and description. |
Delete validation and processing
| Scenario | Expected handling |
|---|---|
| Provider Subscription ID path value is absent or blank | Return HTTP 400 with OperationOutcome. |
| BCBSA correlation ID path value is absent or blank | Return HTTP 400 with OperationOutcome. |
| Subscription cannot be found | Return HTTP 404 with OperationOutcome. |
Subscription is already off | Return HTTP 200 without additional downstream calls. |
| Local soft delete fails | Return HTTP 500. For provider requests, do not call BCBSA. |
| Provider local delete succeeds and BCBSA delete succeeds | Return HTTP 200. |
| Provider local delete succeeds but BCBSA delete fails | Keep local status off, log the external failure for operations, do not roll back, and return HTTP 200. |
| BCBSA-originated local delete succeeds | Return HTTP 200 and do not call BCBSA externally. |
Provider callback handling
| Scenario | Recommended consumer behavior |
|---|---|
| Bundle is malformed or is not FHIR R4 | Return HTTP 400 with OperationOutcome. |
Bundle type is not history | Return HTTP 400 with OperationOutcome. |
| Parameters entry is missing | Return HTTP 400 with OperationOutcome. |
| Notification type is unsupported | Return HTTP 400 with OperationOutcome. |
| Handshake is valid | Durably record the handshake as needed and return HTTP 200 or 204 promptly. |
| Event focus reference cannot be resolved | Return HTTP 400 if the message cannot be accepted, or durably quarantine it and acknowledge according to the agreed contract. |
| Duplicate event | Return HTTP 200 or 204 and do not repeat downstream business processing. |
| Event number is older than the last processed event | Treat as an out-of-order or duplicate event; reconcile using ClaimResponse identifiers and timestamps. |
| Temporary provider processing outage | Return an appropriate 5xx response so the configured delivery policy can treat it as transient. |
| Permanent request defect | Return a 4xx response with safe OperationOutcome details. |
CareFirst event matching and delivery outcomes
| Scenario | CareFirst behavior |
|---|---|
| Notification cannot be associated with an applicable PAS request | Record as unmatched and do not deliver. |
| Requestor type cannot be resolved | Record as unmatched. |
| No NPI or Tax ID can be resolved | Record as unmatched. |
| Provider identifier enrichment fails | Record as enrichment_failed or unmatched and do not deliver. |
| No active subscription matches | Record as unmatched and do not deliver. |
| Callback returns 2xx | Record as delivered. |
| Callback returns non-2xx or times out | Record as failed and apply the configured retry policy. |
| Multiple active subscriptions match | Attempt independent delivery to each matched endpoint. |
Illustrative OperationOutcome
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "invalid",
"details": {
"text": "Subscription.channel.endpoint is missing or invalid."
}
}
]
}
Consumer error-handling requirements
- Inspect both the HTTP status and returned FHIR resource.
- Retain the CareFirst Subscription ID and use it for provider-originated status checks, updates, and deletes.
- Treat
$statusas read-only and inspect the returnedstatusand optionalerrorparameters. - Treat DELETE as deactivation. Do not assume the record was physically removed.
- A provider DELETE HTTP 200 confirms local deactivation but may not prove that BCBSA deregistration succeeded.
- Do not treat status
requestedas active. - After changing the callback endpoint, expect status to remain
requesteduntil asynchronous verification completes. - Keep a durable deduplication key using the Subscription reference, event number, and PAS transaction identifiers.
- Acknowledge valid notifications promptly after durable acceptance, then perform expensive processing asynchronously.
- Do not interpret notification delivery as authorization approval. Inspect ClaimResponse outcome and adjudication.
- Do not retry structural validation failures without correcting the request.
- Retry transient management-operation failures only when the CareFirst contract permits it.
- Do not automatically create a second subscription when a create response is uncertain. Reconcile using correlation data through the approved support process.
- Log only approved operational metadata. Do not log tokens, secrets, full notification Bundles, member identifiers, or clinical data unless explicitly permitted.
Additional Information
This section provides sandbox test credentials for Interoperable APIs and centralized endpoint and environment configuration in Base URL. For lines of business, plan names, and API availability, refer to CMS Interop API Availability and BCBSA IPP API Availability above.
Base URL
This section lists the API, authorization, and token URLs for the Interoperable APIs. {{baseurl}} is the host only (scheme and hostname, with no path or trailing slash), while {{authorization_url}} and {{token_url}} are full endpoints. Interop 2.0 is available after January 1, 2027; Interop 1.0 continues to be supported.
Find what you need:
- API host for Interop 2.0, or Interop 1.0 endpoints for Patient Access, Payer-to-Payer, and Provider Directory: Interop Base URLs
- Authorization URL and Token URL for the Authorization Code grant: OAuth Authorization Code Endpoints
Interop Base URLs
| Environment | Interop 1.0 | Interop 2.0 (available after January 1, 2027) |
|---|---|---|
| Sandbox | LOB-specific URLs | https://apihub-sandbox.carefirst.com |
| Production | LOB-specific URLs | https://apihub.carefirst.com |
Interop 2.0 API and Metadata Paths
Append the paths below to the Interop 2.0 host for your environment only once that version is available. API availability matrices and their limitations still apply.
| API | API Endpoint | Metadata Endpoint |
|---|---|---|
| Patient Access | {{baseurl}}/extfhirpatientaccess/v1 | {{baseurl}}/extfhirpatientaccess/v1/fhir/metadata |
| Payer-to-Payer | {{baseurl}}/extfhirpayeraccess/v1 | {{baseurl}}/extfhirpayeraccess/v1/fhir/metadata |
| Provider Directory | {{baseurl}}/extfhirproviderdir/v1 | {{baseurl}}/extfhirproviderdir/v1/fhir/metadata |
Provider Access and Prior Authorization use Interop 2.0, subject to the availability matrices and version availability above. Their paths have not yet been provided.
Interop 1.0 Patient Access API Endpoints
Interop 1.0 Payer Access API Endpoints
Interop 1.0 Provider Directory API Endpoints
OAuth Authorization Code Endpoints
| Environment | Authorization URL | Token URL |
|---|---|---|
| Sandbox | https://idp-pit.carefirst.com/fhir-oauth2/sec/{{LOB}}/authorize/ | https://idp-pit.carefirst.com/fhir-oauth2/pub/{{LOB}}/token/ |
| Production | https://idp.carefirst.com/fhir-oauth2/sec/{{LOB}}/authorize/ | https://idp.carefirst.com/fhir-oauth2/pub/{{LOB}}/token/ |
Interoperable APIs
Sandbox Test Credentials
Use these credentials to sign in as a sandbox test user of the Patient Access API. Select the line of business (LOB) you want to test. For LOB details and API availability, see CMS Interop API Availability and BCBSA IPP API Availability.
| LOB | Username | Password |
| CHPDC | chpdc_cftestuser6 | Password@123 |
| CHPMD | chpmd_cftestuser5 | Password@123 |
| DSNP | dsnp_cftestuser5 | Password@123 |
| MAPD | mapd_cftestuser5 | Password@123 |
| MHBE | mhbe_cftestuser5 | Password@123 |
| EGWP | egwp_cftestuser2 | Password@123 |
Non-Interoperable APIs
External Developers
External developers have limited access to sandbox and production environments.
The following mapping provides API base URLs and client-credentials token configuration. These hosts do not establish availability for a particular CMS or BCBSA API.
| Environment | Token URL | API Base URL | Client Secret Scope | JWT Assertion Scope | JWT Assertion Audience (aud) |
|---|---|---|---|---|---|
| Sandbox | https://api-pit.carefirst.com/token/v2 | https://api-pit.carefirst.com | fb0bbf9f-9a04-46ce-a473-027706c2e37d/.default | https://cfapimdev.onmicrosoft.com/fb0bbf9f-9a04-46ce-a473-027706c2e37d/.default | https://login.microsoftonline.com/13caa3e0-4c43-4616-be6e-b219a045f73f/oauth2/v2.0/token |
| Production | https://api.carefirst.com/token/v2 | https://api.carefirst.com | 6e6bd3b4-6922-4d5b-b852-a5ff09bda986/.default | https://cfapimprod.onmicrosoft.com/6e6bd3b4-6922-4d5b-b852-a5ff09bda986/.default | https://login.microsoftonline.com/13caa3e0-4c43-4616-be6e-b219a045f73f/oauth2/v2.0/token |
Use the JWT Assertion Audience value as the aud claim. The audience URL
is distinct from the CareFirst Token URL. Send the access-token request to the Token URL
for your environment in the table above.
Important Notes:
- Scope Values: The scope values provided above are current as of this documentation. Always check your application's credentials page for the most up-to-date scope values, as these may change over time.
Internal Developers
Internal developers have access to all development, testing, and production environments with comprehensive API access and scopes.
| Environment | Token URL | API Base URL | Scope |
|---|---|---|---|
| DEVA | https://az****-deva.carefirst.com/token/v1 | https://az****-deva.carefirst.com | f52f1b25-4b31-4a3c-b12c-7566f96ca928/.default |
| SITA | https://az****-sita.carefirst.com/token/v1 | https://az****-sita.carefirst.com | 5fa7e767-5da2-4093-aff9-e7ea8642c02f/.default |
| UAT | https://az****-uat.carefirst.com/token/v1 | https://az****-uat.carefirst.com | 5c14f2a0-d3be-4970-983b-d994d0c5f16d/.default |
| PIT | https://az****-pit.carefirst.com/token/v1 | https://az****-pit.carefirst.com | 517c5f8d-9180-4dae-be4f-a1df65324e38/.default |
| Production | https://az****-prod.carefirst.com/token/v1 | https://az****-prod.carefirst.com | b8945d59-cc76-4c1d-b6f6-ad479afe3e3e/.default |
Help Center
You may get help by using the FAQ, Contact Us, and Documentation pages from the Help Center.
If you have a question or need additional assistance, please reach out to our team by using the Contact Us form located in the Help Center.