Subject-Agnostic Backchannel Authentication (SABA)
Subject-Agnostic Backchannel Authentication (SABA) is a headless flow in the Signicat Authentication REST API. It connects your desktop or mobile app to the itsme® app without user pre-identification.
The SABA flow is most suitable when you want to support:
- Subject-agnostic login: End-users log in without entering a phone number or national identity number first.
- Desktop Web2App flows: Desktop web apps start mobile login on the end-user's phone using a dynamic QR code.
- Simplified mobile App2App flows: Native mobile apps open the itsme® app directly. You do not need to capture redirect callbacks or send token validation requests.
Signicat supports two headless integration patterns for itsme®:
- Code-based App2App flow (
itsme_response_type=code): Uses front-channel app switching and returns an authorisation code to your redirect URL. For details, see the App2App flow guide. - Backchannel SABA flow (
itsme_response_type=none): Uses server-to-server backchannel calls where Signicat resolves tokens in the background.
We recommend you choose the option that matches your target devices and setup. For a comparison of the two, see the Compare flows table.
How it works
You can build SABA flows for web and mobile login by using the headless flow of the Signicat Authentication REST API.
In a headless flow, your frontend and backend work separately. You provide your own user interface in your app or website, while your backend talks directly to the Signicat Authentication REST API.
When your backend creates a session with "flow": "headless" and sets "itsme_response_type": "none", Signicat returns an authorizationRequestUrl. Your frontend shows this URL as a deep link button on mobile (App2App) or as a QR code on desktop (Web2App).
Once the end-user opens the link and completes authentication in the itsme® app, Signicat exchanges the token and gets the user claims in the background. Your backend polls the session status endpoint to get the verified identity data of the end-user.
- Web2App support: Suitable for desktop web applications. The end-user scans a QR code displayed on screen using their smartphone camera or the itsme® app, approves the request on mobile, and the desktop web page automatically logs in.
- Full UI control: You keep complete control over the user interface on both desktop and mobile.
- No manual token exchange: Signicat resolves tokens automatically in the background. Your application does not need to handle an authorisation code or call a token endpoint.
- Subject-agnostic: End-users start the flow right away without typing a phone number or national ID number.
- Backend-driven: You request the end-user's attributes (such as name, date of birth or national ID number) in the API payload when you create the session.
- Polling required: Your backend polls the
/sessions/{id}endpoint every few seconds to check when the end-user finishes.
The diagram below shows the interaction between your application, the end-user, the Signicat API and itsme®:
Sequence diagram showing the itsme® SABA backchannel authentication flow
Prerequisites
- Complete the initial setup described in the Set up itsme® guide to configure itsme® in the Signicat Dashboard.
-
Before you can start making requests to the Authentication REST API, you need to learn how to connect to it. To do this, see Connect to Signicat APIs Quick start guide.
Ensure that you set the Authentication REST API permission for your API client. When you have obtained an access token and are ready to make an API request, return here to resume this guide.
Learn more about the Signicat Authentication REST API- Authentication REST API for conceptual documentation.
- API Reference for endpoint descriptions.
Configure redirect URLs
Redirect URLs define where to redirect end-users after they complete authentication in the itsme® app. For mobile apps, these are typically deep links (Universal Links or App Links) back to your app.
To configure redirect URLs:
- Log in to the Signicat Dashboard.
- Go to Products > eID and Wallet Hub > eIDs.
- Select itsme® from the list of eIDs to open the configuration page.
- Add a default redirect URL.
- Click Save.
Only redirect URLs configured for itsme® in the Signicat Dashboard are permitted. When you pass itsme_redirect_url in your session request, it must match one of the URLs configured in the Dashboard. If you omit itsme_redirect_url in the session request, Signicat automatically uses the default redirect URL configured in the Dashboard.
Implement the authentication flow
In the SABA flow, your application initiates a headless session, presents the returned authorisation link to the end-user and polls Signicat for the session result.
A SABA headless flow consists of three steps:
- Create a session: Your backend sends a session request to the Signicat Authentication REST API with
"flow": "headless","itsme_response_type": "none"and client device metadata. Signicat returns anauthorizationRequestUrl. - Present the authorisation link: Your application presents the
authorizationRequestUrlas an itsme® button on mobile or as a dynamic QR code on desktop. The end-user authenticates in the itsme® app. - Obtain user information: Your backend polls the session status endpoint until the status changes (for example, to
SUCCESS) and retrieves the end-user's verified personal information.
Step 1: Create a session
To initiate an authentication flow, send a POST request from your backend server to the Create a new session endpoint (https://api.signicat.com/auth/rest/sessions).
Request
POST https://api.signicat.com/auth/rest/sessions HTTP/1.1
Host: api.signicat.com
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Content-Type: application/json
In the request body, set "flow": "headless" and include "itsme_response_type": "none" in the additionalParameters object.
itsme® requires client device metadata for risk assessment and fraud prevention in SABA requests. Your request must include at least one device specification parameter in additionalParameters (such as ip_address, device_manufacturer, device_model, device_os, device_os_version, device_locale, device_time or referrer_browser_useragent). If no device parameters are provided, the API returns an error.
For example, your request payload can look like this:
{
"allowedProviders": [
"itsme"
],
"flow": "headless",
"additionalParameters": {
"itsme_response_type": "none",
"itsme_redirect_url": "https://{app-domain}/path",
"ip_address": "198.51.100.24",
"device_manufacturer": "Apple",
"device_model": "iPhone15,2",
"device_os": "iOS",
"device_os_version": "17.4",
"device_locale": "nl-BE",
"device_time": "2026-09-07T10:15:00Z",
"referrer_browser_useragent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Mobile/15E148 Safari/604.1"
},
"requestedAttributes": [
"name",
"firstName",
"lastName",
"dateOfBirth",
"nin"
]
}
Consider the following fields in the request body:
For a complete overview of supported parameters, see the Create a new session endpoint in the API reference.
Device specification parameters
You can include the following parameters inside additionalParameters to describe the end-user's device context:
itsme® services
itsme® organises identity flows into separate services based on your use case. Signicat supports the following itsme® services:
- Authentication: Authenticate returning users and log them in to your application.
- Identification: Identify and onboard new users with verified personal data.
- Qualified signature: Sign electronic documents (available on request; contact us for details).
The attributes you include in requestedAttributes determine which itsme® service is started for the session. Learn more about which attributes trigger each service on the Attributes reference page.
Response
A successful request returns an HTTP 201 Created response containing:
- Metadata about your request.
- A unique session
idto track the authentication process. - The
idpDataobject containing theauthorizationRequestUrlandtransactionId.
Here is an example response:
{
"id": "db415388-c978-4027-84a6-021bd743ef0b",
"accountId": "<ACCOUNT_ID>",
"status": "CREATED",
"idpData": {
"authorizationRequestUrl": "https://idp.prd.itsme.services/v2/authorization?request_uri=urn%3Aietf%3Aparams%3Aoauth%3Arequest_uri%3A...",
"transactionId": "8aa41ada-3cd0-874b-9acd-bd0a5f7e033f"
},
"allowedProviders": [
"itsme"
],
"flow": "headless",
"requestedAttributes": [
"dateOfBirth",
"firstName",
"lastName",
"name",
"nin"
],
"sessionLifetime": 1200,
"expiresAt": "2026-10-09T16:30:00.000Z"
}
Consider the following properties inside the idpData object:
authorizationRequestUrl: The URL used to start authentication in the itsme® app. Present this URL as a deep link on mobile devices or as a QR code on desktop browsers.transactionId: The unique identifier of the authentication transaction with itsme®.
In the SABA flow, idpData does not contain a tokenRequestUrl. Because Signicat completes token retrieval and verification automatically in the background, your application does not need to send a token validation request.
Step 2: Present the authorisation link
To direct the end-user to the itsme® authentication session, you need to present the authorizationRequestUrl in your user interface according to the end-user's device. If you display an itsme® button in your application, you need to make sure your application follows the official itsme® button design guide.
Mobile applications (App2App)
On mobile devices, open the authorizationRequestUrl directly:
- Display an itsme® button in your mobile application.
- When the end-user selects the button, open the
authorizationRequestUrl. - The mobile operating system opens the native itsme® app using a universal link (iOS) or app link (Android).
- The end-user confirms their identity in the itsme® app using their PIN or biometrics.
itsme® implements authorisation request URLs as universal links:
- If the itsme® app is installed on the device, the native app opens directly.
- If the itsme® app is not installed, the link opens in the device's web browser and displays the itsme® authentication page.
Desktop web applications (Web2App)
When your application runs in a desktop browser:
- Render the
authorizationRequestUrlas a dynamic QR code on your login screen. - The end-user scans the QR code using their smartphone camera or the built-in scanner in the itsme® app.
- The itsme® app opens on the end-user's mobile device and displays the authentication request.
- The end-user approves the request in the itsme® app while your desktop web page waits and polls the session status.
At the end of the process, the end-user's identity is securely verified within the itsme® ecosystem. Then, the end-user is automatically redirected to the return URL, according to the outcome of the authentication.
You can preview what the authentication flow with itsme® looks like in the About itsme page.
Step 3: Poll session status and obtain user information
While the end-user completes authentication in the itsme® app, you need to poll the Get session status endpoint from your backend every 1 to 3 seconds to monitor the session status.
Request
To poll the session status, you need to send a GET request to the Get session status endpoint of the Signicat Authentication REST API at https://api.signicat.com/auth/rest/sessions/{id} using the session id returned in Step 1:
GET https://api.signicat.com/auth/rest/sessions/db415388-c978-4027-84a6-021bd743ef0b HTTP/1.1
Host: api.signicat.com
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Session statuses
The status field returns one of the following values:
Only successful authentications (SUCCESS) return the personal data of the end-user.
Response
Once the end-user completes authentication in the itsme® app, the session status changes to SUCCESS. You can find the verified personal information of the end-user in the subject object of the response:
{
"id": "db415388-c978-4027-84a6-021bd743ef0b",
"accountId": "<ACCOUNT_ID>",
"status": "SUCCESS",
"provider": "itsme",
"subject": {
"id": "tXOq9614vLHkXBkENWcZGQO02Fc98IPaHq6iRwK-ytA=",
"idpId": "rpx5rrbsn4ktvhm3m0q4uh2iepsdat34i9vf",
"name": "Maxence Legrand",
"firstName": "Maxence",
"lastName": "Legrand",
"dateOfBirth": "1981-04-24",
"nin": {
"value": "81042419835",
"issuingCountry": "BE",
"type": "PERSON"
}
},
"environment": {
"ipAddress": "198.51.100.24",
"userAgent": "Mozilla/5.0..."
},
"idpData": {
"authorizationRequestUrl": "https://idp.prd.itsme.services/v2/authorization?request_uri=urn%3Aietf%3Aparams%3Aoauth%3Arequest_uri%3A...",
"transactionId": "8aa41ada-3cd0-874b-9acd-bd0a5f7e033f"
},
"allowedProviders": [
"itsme"
],
"loa": "high",
"flow": "headless",
"requestedAttributes": [
"dateOfBirth",
"firstName",
"lastName",
"name",
"nin"
],
"sessionLifetime": 1200,
"expiresAt": "2026-10-09T16:30:00.000Z"
}
You have now completed the backchannel SABA authentication flow with itsme®.
Handle the authentication response
Once your backend receives the subject object, you can match the end-user to an existing account using subject.id or onboard a new user with the verified attributes. Learn more about the returned attributes on the Attributes reference page.
Error handling and session cancellation
Session expiration
If the session lifetime expires before the user completes authentication, the status transitions to EXPIRED. To re-attempt authentication, you need to initiate a new session.
Cancel a session (optional)
You can stop an ongoing authentication session programmatically by calling the Cancel flow endpoint.
This is useful if you want to:
- Provide a button or link in your UI that lets end-users cancel the transaction.
- Cancel an active transaction before starting a new session for the same user.
Request
POST https://api.signicat.com/auth/rest/sessions/{id}/cancel HTTP/1.1
Host: api.signicat.com
Authorization: Bearer <YOUR_ACCESS_TOKEN>
Response
A successful cancellation returns an HTTP 200 OK response with "status": "CANCELLED":
{
"id": "db415388-c978-4027-84a6-021bd743ef0b",
"accountId": "<ACCOUNT_ID>",
"status": "CANCELLED",
"provider": "itsme",
...
}
Next steps
Continue your journey with more itsme® guides:
Dive deeper into the Signicat Authentication REST API: