SDK Backend
Learn how MATTR Holder SDKs connect to a backend MATTR VII tenant through Holder Application configuration, giving you visibility over app instances and enabling capabilities like Wallet Attestation.
An SDK Backend connects each app instance to a backend MATTR VII tenant. This builds on the secure connection your apps already make to your tenant, and gives you:
- Visibility and usage insights: View details about registered and active app instances directly from your tenant, so you can measure adoption and report on usage.
- Wallet Attestation: Enable issuers to verify wallet integrity before issuing high-assurance credentials. See Wallet Attestation for more information.
- A foundation for flexible app management: The SDK Backend establishes a channel we expect to extend over time, for example keeping trusted issuer lists current and updating app settings without waiting for an app store release.
SDK Backend support is available from the following SDK versions:
- iOS Holder SDK: 6.0.0
- Android Holder SDK: 7.0.0
SDK Backend is currently not available in the React Native Holder SDK.
SDK Backend is currently optional. You enable it by providing a platform configuration when initializing the SDK. If you initialize the SDK without a platform configuration, the SDK skips registration and does not connect to a backend, so capabilities such as Wallet Attestation are unavailable. We expect to make the SDK Backend required in an upcoming release, so we recommend configuring it now to prepare.
How it works
Setting up the SDK Backend involves three steps:
- Configure a Holder Application on your MATTR VII tenant: You register your mobile app by creating a Holder Application, identified by the bundle identifier (iOS) or the package fingerprint (Android).
- Initialize the SDK with your tenant details: When you initialize the SDK in your app, you pass the details of the MATTR VII tenant and the Holder Application you configured on it.
- Automatic communication: Once initialized, instances of your app will automatically communicate with the configured MATTR VII tenant and retrieve the required tokens to operate and make requests to the tenant when required.
Token validity and offline use
The tokens issued during this process have configurable validity periods controlled by the
maxTimeOfflineInSecs field on your Holder Application configuration. This means your app can
function without internet connectivity to meet different use cases:
- Minimum: 1 day (86400 seconds)
- Maximum: 30 days (2592000 seconds)
- Default: 7 days (604800 seconds)
When the license token expires, the SDK must reconnect to the MATTR VII tenant to renew it.
Configuring the SDK Backend
Configure Holder Applications
The SDK Backend is optional. To configure it, create a Holder Application on your MATTR VII tenant for each platform target (iOS and Android). This is a one-time setup process that registers your app with the tenant and allows app instances to obtain the necessary tokens for authentication and operation.
You can create a Holder Application either in the MATTR Portal or via the MATTR VII API.
- Log in to the MATTR Portal and expand the Credential holding section in the left-hand navigation panel.
- Select Applications, then select the Create new button.
- Use the Name text box to insert a meaningful and friendly name for your application.
- Use the Client ID text box to insert the OAuth 2.0
client_idvalue that your holder application uses when requesting client attestations. This value must match theclient_idconfigured by issuers who trust this Holder Application. For more detail, see agreeing on a client identifier. - Use the Type radio button to select iOS.
- Use the Team ID text box to insert your Apple Developer Team ID.
- Use the Bundle ID text box to insert the Bundle ID of your app (must match your Xcode project configuration).
- Use the App Attest toggle to set whether App Attest is Active or Inactive. When active, the app instance must provide a valid App Attest attestation during registration and token renewal. When inactive, the app can register and renew tokens using an authentication assertion only. Refer to attestation vs assertion fall back for more information.
- When App Attest is active, use the App Attest environment toggle to select Development or
Production. Apple recommends
developmentfor testing andproductionfor distribution builds. - Use the Max time offline field to set the maximum time the SDK can operate offline before requiring a new license token from the configured MATTR VII backend. The minimum is 1 day and the maximum is 30 days. The default is 7 days. Refer to token validity and offline use for more information.
- Select the Create button to create the application and display its detail screen.
- Copy and record the
IDvalue. You will use it later when initializing the SDK so that it can correctly identify and authenticate your application.
Initialize the SDK with platform configuration
If you are using the SDK Backend, update your SDK initialization to include the platform
configuration once your Holder Applications are created. This enables your app to connect to the
correct MATTR VII tenant and Holder Application. If you are not using an SDK Backend, you can initialize
the SDK without a platformConfiguration.
Initialize the SDK with your platform configuration:
let platformConfig = PlatformConfiguration(
tenantHost: URL(string: "https://your-tenant.vii.mattr.global")!,
applicationId: "1ef1f867-20b4-48ea-aec1-bea7aff4964c"
)
try await MobileCredentialHolder.shared.initialize(
platformConfiguration: platformConfig
)tenantHost: The URL of your MATTR VII tenant. This must be the tenant where your iOS Holder Application is configured.applicationId: Theidof your configured iOS Holder Application.
Once your Holder Application configurations are created, your application will be able to use the SDK and interact with the MATTR VII platform (for example, to obtain attestation tokens).
Managing application instances
Once your Holder Application is configured and the SDK is initialized, each device that launches your app registers as a new application instance on your configured backend MATTR VII tenant. You can view and manage these instances via the MATTR VII API.
Retrieve all registered instances
To view all registered instances for a Holder Application and track usage:
GET /v1/holder/applications/{holderApplicationId}/instancesholderApplicationId: Theidof the Holder Application you want to inspect.
The response includes a paginated list of all registered instances:
{
"data": [
{
"id": "1ef1f867-20b4-48ea-aec1-bea7aff4964c",
"appAttestationType": "app_attestation",
"registeredAt": "2023-10-05T14:48:00.000Z",
"licenseExpiresAt": "2024-10-05T14:48:00.000Z",
"lastAttestedAt": "2023-12-01T10:30:00.000Z",
"externalReferenceId": "external-ref-12345",
"deviceDetails": {
"deviceModel": "iPhone 12",
"deviceMake": "Apple",
"osVersion": "iOS 14.4"
},
"sdkDetails": {
"sdkVersion": "1.2.3"
}
}
],
"nextCursor": "Y3JlYXRlZEF0PTIwMjAtMDgtMjVUMDY6NDY6MDkuNTEwWiZpZD1hNjZmZmVhNS04NDhlLTQzOWQtODBhNC1kZGE1NWY1M2UzNmM"
}Each instance includes:
id: Unique identifier for the registered instance.appAttestationType: The type of attestation used during registration (none,app_attestation, orkey_attestation).registeredAt: When the instance was first registered.licenseExpiresAt: When the instance's license expires (the Holder SDK will automatically handle license renewal).lastAttestedAt: When the instance was last attested.deviceDetails: Information about the device (model, make, OS version).sdkDetails: Information about the SDK version used by the instance.
This is useful for tracking how many devices are actively using your application and monitoring usage quotas.
Delete a specific instance
To remove a specific registered instance:
DELETE /v1/holder/applications/{holderApplicationId}/instances/{instanceId}holderApplicationId: Theidof the Holder Application.instanceId: Theidof the specific instance to delete.
Once deleted, the instance can no longer interact with the platform or receive tokens, and any existing tokens are revoked.
Deleting instances is primarily useful during testing when you have a limited number of devices and need to re-register a fresh instance (for example, to test the initial registration flow again). In production, there is nothing preventing the application from requesting another token on the next launch, which would create a new instance — so deleting instances is not an effective way to block a device.
Attestation vs Assertion fall-back
When configuring a Holder Application, you control whether your MATTR VII tenant requires attestation (hardware-backed proof of app integrity) or also accepts a lighter-weight assertion (a cryptographic signature proving key possession) during instance registration and token renewal.
Each platform has an attestation configuration with a required boolean:
- When
requiredistrue, the app instance must provide a valid attestation during registration and token renewal. - When
requiredisfalse, your tenant also accepts an assertion when an attestation is not available.
The SDK handles this automatically. It always attempts to provide an attestation, and falls back to
an assertion if it cannot generate one (for example, when the platform attestation service is
temporarily unavailable). Your tenant then accepts or rejects the request based on the required
setting. Your application does not need to manage attestation or assertion details directly.
When to use each setting
| Scenario | Recommended setting |
|---|---|
| Production apps in distribution | required: true — Provides the strongest integrity guarantees by verifying the app and device through OS-level attestation. |
| Development and testing | required: false — Useful when running on simulators or devices where attestation services are unavailable. |
| Broad device compatibility | required: false — Some older devices may not support hardware attestation. The assertion fall-back ensures these devices can still register. |
Setting attestation to required: false reduces the security guarantees of the SDK Backend.
Only use this setting when you have a specific need, such as supporting older devices
or during development.
Certificate expiry and required Key Attestation (Android)
This behavior is specific to Android Key Attestation. It does not apply to iOS App Attest.
When Key Attestation is set to required, an attestation must be present, parseable, and trusted (a trusted root with each certificate in the chain signed by the one above it) for registration to succeed.
One thing to be aware of: our validation does not check whether the certificates in the attestation chain have expired. Some Android devices, including relatively recent models, generate attestations where part or all of the certificate chain is already past its validity period. To avoid blocking these devices, an otherwise valid attestation with expired certificates is still treated as a successful attestation, even when Key Attestation is set to required.
In practice this means a device presenting an expired (but otherwise valid) attestation chain will register successfully and be marked as attested. This behavior may be tightened in a future release, so we recommend not relying on certificate expiry as part of your own trust decision.
How would you rate this page?
Last updated on