---
title: "Codeunit 501 OAuth2"
author: "Jonas Paprotka"
url: https://jonas-paprotka.de/ref/codeunit/501-oauth2/
type: codeunit
id: 501
name: "OAuth2"
app: "System Application"
namespace: System.Security.Authentication
versions: "17-28"
build: 28.5.54151.54365
source: "https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/24/ https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/25/ https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/26/ https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/27/ https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/28/ https://jonas-paprotka.de/ref/codeunit/501-oauth2/source/29/"
checked: 2026-09-20
subject: "Microsoft Dynamics 365 Business Central"
license: "Content © 2026 Jonas Paprotka. Quote freely with attribution and a link."
---

# Codeunit 501 OAuth2

Jonas Paprotka, https://jonas-paprotka.de/ref/codeunit/501-oauth2/

| | |
| --- | --- |
| App | System Application |
| Namespace | System.Security.Authentication |
| Versions | 17-28 |
| Source file | OAuth2/OAuth2.Codeunit.al |

## Procedures

| Name | Parameters | Returns | Access | Versions | Obsolete | Reason |
| --- | --- | --- | --- | --- | --- | --- |
| AcquireTokenByAuthorizationCode | (Text, Text, Text, Text, Text, Enum Prompt Interaction, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Replaced with AcquireTokenByAuthorizationCode with Scopes parameter |
| AcquireTokenByAuthorizationCode | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokenByAuthorizationCode with SecretText data type for AccessToken. |
| AcquireTokensByAuthorizationCode | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokensByAuthorizationCode with SecretText data type for AccessToken. |
| AcquireTokenAndTokenCacheByAuthorizationCode | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokenAndTokenCacheByAuthorizationCode with SecretText data type for AccessToken. |
| AcquireTokensAndTokenCacheByAuthorizationCode | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokensAndTokenCacheByAuthorizationCode with SecretText data type for AccessToken. |
| AcquireOnBehalfOfToken | (Text, Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Replaced with AcquireOnBehalfOfToken with Scopes parameter |
| AcquireOnBehalfOfToken | (Text, List, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfToken with SecretText data type for AccessToken. |
| AcquireOnBehalfOfTokens | (Text, List, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfTokens with SecretText data type for AccessToken. |
| RequestClientCredentialsAdminPermissions | (Text, Text, Text, var Boolean, var Text) | Boolean | public | 17-28 | - | - |
| AcquireTokenWithClientCredentials | (Text, Text, Text, Text, Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokenWithClientCredentials with SecretText data type for AccessToken. |
| AcquireTokenWithClientCredentials | (Text, Text, Text, Text, List, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokenWithClientCredentials with SecretText data type for AccessToken. |
| AcquireAuthorizationCodeTokenFromCache | (Text, Text, Text, Text, var Text) | Boolean | public | 17-22 | Pending 17.0 | Added OAuthority parameter |
| AcquireAuthorizationCodeTokenFromCache | (Text, Text, Text, Text, Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Replaced with AcquireAuthorizationCodeTokenFromCache with Scopes parameter |
| AcquireAuthorizationCodeTokenFromCache | (Text, Text, Text, Text, List, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireAuthorizationCodeTokenFromCache with SecretText data type for AccessToken. |
| AcquireTokensFromCache | (Text, Text, Text, Text, List, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireTokensFromCache with SecretText data type for AccessToken. |
| AcquireOnBehalfAccessTokenAndRefreshToken | (Text, Text, Text, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Renaming to AcquireOnBehalfAccessTokenAndTokenCache |
| AcquireOnBehalfAccessTokenAndTokenCache | (Text, Text, Text, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Replaced with AcquireOnBehalfAccessTokenAndTokenCache with Scopes parameter |
| AcquireOnBehalfAccessTokenAndRefreshToken | (Text, Text, List, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Renaming to AcquireOnBehalfAccessTokenAndTokenCache  |
| AcquireOnBehalfAccessTokenAndTokenCache | (Text, Text, List, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfAccessTokenAndTokenCache with SecretText data type for AccessToken. |
| AcquireOnBehalfTokensAndTokenCache | (Text, Text, List, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfTokensAndTokenCache with SecretText data type for AccessToken. |
| AcquireOnBehalfOfTokenByRefreshToken | (Text, Text, Text, Text, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Renaming to AcquireOnBehalfOfTokenByTokenCache  |
| AcquireOnBehalfOfTokenByTokenCache | (Text, Text, Text, Text, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Replaced with AcquireOnBehalfOfTokenByTokenCache with Scopes parameter |
| AcquireOnBehalfOfTokenByRefreshToken | (Text, Text, List, Text, var Text, var Text) | Boolean | public | 17-22 | Pending 18.0 | Renaming to AcquireOnBehalfOfTokenByTokenCache  |
| AcquireOnBehalfOfTokenByTokenCache | (Text, Text, List, Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfTokenByTokenCache with SecretText data type for AccessToken. |
| AcquireOnBehalfOfTokensByTokenCache | (Text, Text, List, Text, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfTokensByTokenCache with SecretText data type for AccessToken. |
| AcquireOnBehalfOfTokenByTokenCache | (Text, Text, Text, Text, List, Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfTokenByTokenCache with SecretText data type for AccessToken. |
| AcquireOnBehalfOfTokensByTokenCache | (Text, Text, Text, Text, List, Text, var Text, var Text, var Text) | Boolean | public | 17-26 | Pending 24.0 | Use AcquireOnBehalfOfTokensByTokenCache with SecretText data type for AccessToken. |
| AcquireTokensWithUserCredentials | (Text, Text, List, Text, Text, var Text, var Text) | Boolean | public | 17-23 | Pending 21.0 | AcquireTokensWithUserCredentials is deprecated and will be removed in version 23.0. We recommend that you switch to any of the remaining non-deprecated functions in this class to acquire tokens already now. |
| AcquireTokensWithUserCredentials | (Text, List, Text, Text, var Text, var Text) | Boolean | public | 17-23 | Pending 21.0 | AcquireTokensWithUserCredentials is deprecated and will be removed in version 23.0. We recommend that you switch to any of the remaining non-deprecated functions in this class to acquire tokens already now |
| GetDefaultRedirectURL | (var Text) | - | public | 17-28 | - | - |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, Text, Enum Prompt Interaction, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken. |
| AcquireTokensByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokensByAuthorizationCodeWithCertificate with SecretText data type for AccessToken. |
| AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken. |
| AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var Text, var Text, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, Text, Text, Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, Text, Text, List, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken. |
| AcquireTokensFromCacheWithCertificate | (Text, Text, Text, Text, List, var Text, var Text) | Boolean | public | 18-26 | Pending 24.0 | Use AcquireTokensFromCacheWithCertificate with SecretText data type for AccessToken. |
| GetLastErrorMessage | () | Text | public | 19-28 | - | - |
| AcquireTokensWithCertificate | (Text, Text, Text, Text, List, var Text, var Text) | Boolean | public | 21-26 | Pending 24.0 | Use AcquireTokensWithCertificate with SecretText data type for AccessToken. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, Text, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, SecretText, Text, Text, Text, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, SecretText, Text, Text, Text, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, SecretText, SecretText, Text, Text, Text, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenByAuthorizationCode | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenByAuthorizationCodeWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokenByAuthorizationCodeWithCertificate | (Text, SecretText, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensByAuthorizationCode | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensByAuthorizationCodeWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokensByAuthorizationCodeWithCertificate | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensByAuthorizationCodeWithCertificate | (Text, Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensByAuthorizationCodeWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokensByAuthorizationCodeWithCertificate | (Text, SecretText, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenAndTokenCacheByAuthorizationCode | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokenAndTokenCacheByAuthorizationCodeWithCertificate | (Text, SecretText, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensAndTokenCacheByAuthorizationCode | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate | (Text, Text, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokensAndTokenCacheByAuthorizationCodeWithCertificate | (Text, SecretText, SecretText, Text, Text, List, Enum Prompt Interaction, var SecretText, var Text, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfToken | (Text, List, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfTokens | (Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokenWithClientCredentials | (Text, SecretText, Text, Text, Text, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireTokenWithClientCredentials | (Text, SecretText, Text, Text, List, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, Text, Text, Text, var SecretText) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, SecretText, Text, Text, Text, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, SecretText, Text, Text, Text, var SecretText) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, SecretText, SecretText, Text, Text, Text, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireAuthorizationCodeTokenFromCache | (Text, SecretText, Text, Text, List, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireTokensFromCache | (Text, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, Text, Text, List, var SecretText) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, SecretText, Text, Text, List, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, Text, SecretText, Text, Text, List, var SecretText) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireAuthorizationCodeTokenFromCacheWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireAuthorizationCodeTokenFromCacheWithCertificate | (Text, SecretText, SecretText, Text, Text, List, var SecretText) | Boolean | public | 24-28 | - | - |
| AcquireTokensFromCacheWithCertificate | (Text, Text, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensFromCacheWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokensFromCacheWithCertificate | (Text, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensFromCacheWithCertificate | (Text, Text, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokensFromCacheWithCertificate | (Text, SecretText, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensWithCertificate | (Text, Text, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensWithCertificate with SecretText data type for AccessToken and Certificate. |
| AcquireTokensWithCertificate | (Text, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireTokensWithCertificate | (Text, Text, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-27 | Pending 25.0 | Use AcquireTokensWithCertificate with SecretText data type for AccessToken, Certificate and CertificatePassword. |
| AcquireTokensWithCertificate | (Text, SecretText, SecretText, Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfAccessTokenAndTokenCache | (Text, Text, List, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfTokensAndTokenCache | (Text, Text, List, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfTokenByTokenCache | (Text, Text, List, Text, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfTokensByTokenCache | (Text, Text, List, Text, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfTokenByTokenCache | (Text, SecretText, Text, Text, List, Text, var SecretText, var Text) | Boolean | public | 24-28 | - | - |
| AcquireOnBehalfOfTokensByTokenCache | (Text, SecretText, Text, Text, List, Text, var SecretText, var Text, var Text) | Boolean | public | 24-28 | - | - |
| GetClaims | (SecretText) | JsonObject | public | 26-28 | - | - |
| AcquireAuthorizationCode | (Text, SecretText, Text, Text, List, Enum Prompt Interaction, Text, var Text, var Text) | Boolean | public | 27-28 | - | - |

## Source

Symbols: Microsoft.SystemApplication.symbols.63ca2fa4-4f03-4f2b-a480-172fef340d3f, https://dynamicssmb2.pkgs.visualstudio.com/DynamicsBCPublicFeeds/_packaging/MSSymbols/nuget/v3/index.json, highest build per major on 2026-09-20.
AL source 24: https://github.com/microsoft/BCApps, MIT, releases/24.x at fe14d3e6db00d28df3a69c7bba830813d70794e2.
AL source 25: https://github.com/microsoft/BCApps, MIT, releases/25.x at 68d52c129129c83b2e396a473aaa5b2ce61d2eed.
AL source 26: https://github.com/microsoft/BCApps, MIT, releases/26.x at 78c4acf0d64a8eee157ea80164fa8fc2acffc9eb.
AL source 27: https://github.com/microsoft/BCApps, MIT, releases/27.x at 1749020b4c9445a43e4f7f540e89b7fa76ec25fd.
AL source 28: https://github.com/microsoft/BCApps, MIT, releases/28.x at 740f59156b249f8ed7cba2e28423f03ae7b07233.
AL source 29: https://github.com/microsoft/BCApps, MIT, releases/29.x at a66254c3b8b5bb1cea290dc8f9d097aec4381153.

Jonas Paprotka, 2026-09-20.
