|
The following overview provides guidance for developers on the process of registering their FHIR (Fast Healthcare Interoperability Resources) application for use with Veradigm EHR. This overview will serve as a guide to streamline the registration process and facilitate the deployment of your FHIR application. |
Review our terms of use and documentation to begin developing your FHIR integration.
When you register your developer account, accept the User Agreement and provide a valid email address. You’ll receive credentials that you can use to register your applications. If you have questions, reach out to VeradigmConnect@veradigm.com.
Note: For information on Altera’s Developer Program, contact Altera at ADP@alterahealth.com. Altera products include Altera TouchWorks EHR, Sunrise, and Paragon.
The Veradigm FHIR API is limited to read-only access. For application developers seeking deeper integration with Veradigm EHR, Veradigm Connect offers the bidirectional Unity API, enabling both reads and writes. To integrate with Veradigm Practice Management, developers must utilize Unity to read or write patient demographic, appointment, or financial data.
Veradigm EHR version 24.5 or later supports Single Sign-On (SSO). For app launch capabilities, developers are advised to leverage Unity for earlier versions of Veradigm EHR.
For more information, contact VeradigmConnect@veradigm.com.
Sign up at https://developer.veradigm.com/ to get access to Veradigm FHIR-enabled APIs and start testing in our sandboxes.
Register your FHIR application to connect to clients and begin testing.
The application has been registered. However, before it can be activated for a client, the developer needs to perform the following additional steps:
Important: Do not request production access for the application until the application name, type, and Purpose of Use are finalized and the application is fully tested. These values cannot be changed once production access is granted.
The FHIR application is reviewed and, if appropriate, approved by Veradigm Connect. Once approved, clients can begin activating the FHIR application.
Clients use a separate portal for licensing and managing FHIR applications linked to their organization. Veradigm Connect developers cannot license their applications for clients; the clients must activate applications themselves through the client License Management Portal. If a client requests guidance from a FHIR application developer, you can provide them the following link to documentation: License Management Portal documentation.
Note that developers do not have access to this documentation site. Clients must use their Veradigm Client Portal credentials to access this information.
For information about testing credentials, go to the Partner Testing Environments page.
You can use most API test utilities to test your FHIR application. The Veradigm FHIR API teams uses Postman to test Patient and User type FHIR applications. Custom utilities can be created to test System type FHIR applications.
Patient and Provider type FHIR applications authenticate by entering user credentials for Veradigm EHR or a patient portal (such as AHC or FollowMyHealth). An API testing utility can send requests to these systems to obtain the appropriate tokens.
Before attempting to send FHIR requests to Veradigm EHR, it is helpful to create an environment file with the following variables.
Instead of entering product credentials to obtain a token, System applications make a direct call to the Token URL. The body of the request must include the following:
To validate the JWT used in client_assertion, the authorization server must be able to retrieve and parse your JWKS (JSON Web Key Set). Please ensure the following:
RSA key type (kty) and be suitable for signature verification (use: "sig").n) and exponent (e) must be base64url-encoded without padding.kid (Key ID) to allow key selection during JWT validation.{
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "abc123",
"alg": "RS256",
"n": "oahUIz...base64url-encoded-modulus...",
"e": "AQAB"
}
]
}
private async Task
{
string accessToken = null;
string tokenURL = "[token URL of FHIR auth server]";
string clientID = "[your FHIR app client ID]";
var tokenCode = GenerateJWT(tokenURL, clientID);
var address = new Uri(tokenURL);
using (var handler = new HttpClientHandler())
{
handler.UseCookies = false;
using (var client = new HttpClient(handler))
{
var message = new HttpRequestMessage(HttpMethod.Post, address);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair
new KeyValuePair
new KeyValuePair
new KeyValuePair
});
message.Content = content;
var httpResponse = await client.SendAsync(message);
var result = await httpResponse.Content.ReadAsStringAsync();
if (httpResponse.IsSuccessStatusCode)
{
var tokenResponse = JObject.Parse(result);
accessToken = tokenResponse.SelectToken("access_token").Value
}
}
}
return accessToken;
}
private string GenerateJWT(string authServerTokenURL, string clientID)
{
X509Store store = new X509Store(StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 signingCert = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false)[0];
var jti = CryptoRandom.CreateUniqueId(32);
List
{
new Claim("sub", clientID),
new Claim("jti", jti),
};
var tokenHandler = new System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Issuer = clientID,
Audience = authServerTokenURL,
Expires = DateTime.UtcNow.AddMinutes(5),
SigningCredentials = new X509SigningCredentials(signingCert)
};
var token = tokenHandler.CreateJwtSecurityToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return tokenString;
}